@After,@之前没有在testcase中工作

abh*_*eta 14 java junit testcase

我已经开始测试,现在我想使用@After,@Before@Test但我的应用程序只运行的@Before方法和控制台提供输出

之前

但是,如果我删除@After@Before运行@Test.我的代码在这里:

public class TestPractise extends AbstractTransactionalDataSourceSpringContextTests{

    @Before
    public void runBare(){
        System.out.println("before");
    }

    @Test
    public void testingMethod(){
        System.out.println("testing");
    }

    @After
    public void setDirty(){
        System.out.println("after");
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么不@After,@Test@before同时工作?

vik*_*m k 13

使用@BeforeEach替代@Before@AfterEach取代@After.

  • 您能否添加一些有关为什么以及如何解决问题的解释? (2认同)
  • 在我的情况下,我的“@Before”和“@After”代码没有运行,但是当我用“@BeforeEach”和“@After”和“@AfterEach”替换“@Before”时它起作用了。 (2认同)
  • 老兄!我花了几个小时才弄清楚这一点! (2认同)

Rom*_*las 11

AbstractTransactionalDataSourceSpringContextTests类强制使用旧的JUnit 3.x的语法,这意味着任何的JUnit 4注释将不起作用.

runBare()执行方法不是因为@Before注释,而是因为它被命名runBare(),这是由ConditionalTestCaseJUnit TestCase类提供的方法.

所以你有2个解决方案:

  • 使用AlexR答案使用JUnit 4测试和Spring;
  • 继承你的继承AbstractTransactionalDataSourceSpringContextTests,但使用onSetUponTearDown方法而不是@Before@After方法.


小智 9

检查您是否正在使用 Junit4,因为从 Junit5 开始,@Before/@After 现在是 @BeforeEach/@AfterEach,类似的 @BeforeClass/@AfterClass 是 @AfterAll/@BeforeAll。


Ale*_*exR 6

它应该可以工作...但是由于您正在使用 spring 框架并且几年前引入了 JUnit 4,我建议您使用注释而不是继承。

所以,用@RunWith(SpringJUnit4ClassRunner.class). 删除extends AbstractTransactionalDataSourceSpringContextTests

不要忘记将@Before和 @After 方法设为静态

现在它应该可以工作了。

即使您想扩展 Spring 抽象测试类,至少也要注意其中一些已被弃用。例如AbstractTransactionalDataSourceSpringContextTests,不推荐使用类。


sxc*_*731 6

JUnit Jupiter,又名“JUnit 5”:使用@BeforeAll

如果您使用较新的 JUnit Jupiter(Java 8 及以上版本),您将需要替换@Before@BeforeAll.

此外,您需要使用注释您的测试类@TestInstance(Lifecycle.PER_CLASS)或创建@BeforeAll方法static。这是一个例子:

@TestInstance(Lifecycle.PER_CLASS)
class MyTestClass {

    MyHeavyResource sharedResource;

    @BeforeAll
    void init() {
        System.out.println("init");
        sharedResource = new MyHeavyResource(1234);
    }

    @Test
    void myTest() {
        System.out.println("myTest");
        sharedResource.methodUnderTest();
    }
}

Run Code Online (Sandbox Code Playgroud)

理解Lifecycle.PER_CLASS

JUnit 5 对此更加严格(要求两者之一)的可能原因staticLifecycle.PER_CLASS它希望测试作者承认在方法中初始化的任何资源实例@BeforeAll将真正在类中的每个单独的单元测试方法之间共享。这可能会损害它们的隔离性,例如,如果sharedResource上面的示例中的不是无状态/幂等的。

如果sharedResource不能安全地共享(或者如果它是相当轻量级的),则init应该用 来注释该方法@BeforeEach,这将在执行类中的每个单独测试之前创建一个新实例。

JavadocTestInstance解释了 using 如何Lifecycle.PER_CLASS实际强制执行测试类的单个实例;而 JUnit 4 及更早版本的行为相当于Lifecycle.PER_METHOD,它为其中包含的每个方法创建了一个新的测试类实例@Test。这会在某种程度上误导作者,认为@Before每个测试只执行一次。