问题描述
这是我的考试班
@SpringBoottest
@ActiveProfiles("test")
public MyTest {
...
@Before
public void init() {
System.out.println(":::: --- start init() ---");
...
}
...
}
奇怪的是,init()
由于某种原因不会运行。如果将@Before
更改为@BeforeAll
,并将方法更改为静态,则init()
将运行。问题在于这些数据设置代码无法在静态方法中运行,并且我无法将所有代码都更改为在静态块中运行。现在,我在每种测试方法中都有以下代码来克服该问题
if(list.size() == 0)
init();
我想知道@Before
为什么不运行。有什么建议吗?
解决方法
在JUnit 5中,@BeforeEach
和@BeforeAll
注释与JUnit 4中的@Before
和@BeforeClass
等效。
@Before
是一个JUnit 4注释,而@BeforeAll
是一个JUnit 5注释。您还可以从导入org.junit.Before
和org.junit.jupiter.api.BeforeAll
看到这一点。
此外,标记为@BeforeEach
的代码在每次测试之前执行,而@BeforeAll
则在整个测试夹具之前运行一次。
要能够在非静态方法上运行@BeforeAll
,您可以使用以下方法更改测试实例的生命周期:
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
但是,您必须要小心,因为测试类实例现在仅创建一次,而不是每个测试方法创建一次。如果您的测试方法依赖于实例变量中存储的状态,则现在可能需要在@BeforeEach
或@AfterEach
生命周期方法中手动重置状态。