JUnit @BeforeClass非静态解决Spring Boot应用程序

Kin*_*ere 18 junit spring unit-testing dependency-injection spring-boot

@BeforeClass如果要在所有@Test方法之前运行一次,JUnit的注释必须声明为static .但是,这不能用于依赖注入.

@Autowire在运行JUnit测试之前,我想用Spring Boot 清理一个数据库.我不能@Autowire静态字段所以我需要考虑一个解决方法.有任何想法吗?

Ral*_*lph 32

只需使用@Before(而不是@BeforeClass)(或BeforeTransaction(取决于您如何初始化数据库)).此注释必须附加到非静态公共方法.

当然: @Before在每个测试用例方法之前运行(不像@BeforeClass只运行一次.)但是如果你想要只运行一次,那么使用静态标记字段.

private static boolean initialized = false;
...
@Before
public void initializeDB() { 
   if (!initialized) {
       ... //your db initialization
       initialized = true;
   }
}
---
Run Code Online (Sandbox Code Playgroud)

  • @LunaticJape:我的解决方法是使用“@After”方法将实例(“@Autowired”字段值)传递给静态字段,然后在“@AfterClass”方法中使用该字段。 (2认同)

rad*_*tao 5

对于JUnit5测试执行订单@TestInstance(Lifecycle.PER_CLASS)

科特林示例:

@ExtendWith(SpringExtension::class)
@TestInstance(PER_CLASS)
class BeforeInstanceTests {

    private var initialized: String = ""
    private val callList: MutableList<String> = ArrayList()

    @BeforeAll
    fun beforeAllNonStatic() {
        initialized = "initialized"
        assertEquals(0, callList.size)
    }

    @Test
    fun test1() {
        assertEquals("initialized", initialized)
        callList.add("test1")
    }

    @Test
    fun test2() {
        assertEquals("initialized", initialized)
        callList.add("test2")
    }

    @Test
    fun test3() {
        assertEquals("initialized", initialized)
        callList.add("test3")
    }

    @AfterAll
    fun afterAllNonStatic() {
        assertEquals("initialized", initialized)
        assertEquals(3, callList.size)
        assertTrue(callList.contains("test1"))
        assertTrue(callList.contains("test2"))
        assertTrue(callList.contains("test3"))

        callList.clear()
        initialized = ""
    }
}
Run Code Online (Sandbox Code Playgroud)