33

我已经开始测试,现在我想使用@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");
    }
}

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

4

7 回答 7

54

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

于 2018-07-25T09:39:51.340 回答
20

The AbstractTransactionalDataSourceSpringContextTests class forces the use of the old JUnit 3.x syntax, which means that any of the JUnit 4 annotation will not work.

Your method runBare() is executed not because of the @Before annotation, but because it is named runBare(), which is a method provided by ConditionalTestCase and JUnit TestCase class.

So you have 2 solutions:

  • Use the AlexR answer to use JUnit 4 tests and Spring;
  • Keep your inheritance of AbstractTransactionalDataSourceSpringContextTests, but use the onSetUp and onTearDown methods instead of the @Before and @After methods.
于 2012-05-14T14:44:58.657 回答
16

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

于 2020-07-14T06:58:44.280 回答
7

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

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

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

现在它应该可以工作了。

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

于 2012-05-14T09:35:59.227 回答
1

如果您在 IDE 中使用自动导入,请确保@Test@Before是从org.junit包中导入的。

于 2021-03-08T12:00:36.093 回答
0

就我而言,我遇到了这个问题,解决方案是更改 java 访问修饰符,它是私有的。

之前(不工作)@Test void validate() throws Exception {}

之后(工作)@Test public void validate() throws Exception {}

于 2020-10-30T21:40:09.333 回答
0

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();
    }
}

理解Lifecycle.PER_CLASS

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

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

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

于 2022-01-27T11:50:53.063 回答