在Spring Boot中设置集成测试数据

问题描述

这是我的考试班

    @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.Beforeorg.junit.jupiter.api.BeforeAll看到这一点。

此外,标记为@BeforeEach的代码在每次测试之前执行,而@BeforeAll则在整个测试夹具之前运行一次。

要能够在非静态方法上运行@BeforeAll,您可以使用以下方法更改测试实例的生命周期:

@TestInstance(TestInstance.Lifecycle.PER_CLASS)

但是,您必须要小心,因为测试类实例现在仅创建一次,而不是每个测试方法创建一次。如果您的测试方法依赖于实例变量中存储的状态,则现在可能需要在@BeforeEach@AfterEach生命周期方法中手动重置状态。