我的应用程序使用数据库中的数据进行一些简单的自定义初始化。我想进行集成测试以测试此行为。它会:
由于我使用的是Spring Boot框架,因此不需要实际重新启动应用程序,我所需要做的就是销毁并重新创建要测试的bean。但是,我认为的任何方法都有一些可怕的缺陷。
这对我不起作用,因为我必须有两种不同的测试方法。一个执行上述步骤2,另一个执行步骤5。通过使用以下注释测试类,可以完成应用程序的启动和关闭:
@TestInstance(TestInstance.Lifecycle.PER_METHOD)
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
但不幸的是,在Junit5中,它是not possible to specify the order of tests。所以我不能确定2在5之前执行。
我尝试用@BeforeAll
和@BeforeEach
注释第一个测试方法,但这以某种方式抵消了@DirtiesContext
注释的影响,并且ApplicationContext不会重置。
ApplicationContext
:我将重新创建要手动测试的bean。
@Test
fun test(@Autowired applicationContext: ApplicationContext)
{
simulateUserActionAsInStep2()
val factory = applicationContext.autowireCapableBeanFactory
factory.destroyBean(service)
val reCreatedService = factory.createBean(Service::class.java)
factory.autowireBean(reCreatedService)
testServiceAsInStep5(reCreatedService)
}
除了没有赢得选美大赛之外,这种解决方案对我来说还很脆弱,而且可能不正确,因为我仅重新创建了一个bean。可能还需要重新创建其他受影响的bean,以使测试不给出错误的阴性结果。
我可以添加一些额外的代码,使这两种方法以指定的顺序执行我想要的事情:
@Test
fun testMethod1()
{
// If this method is being executed as the first one
if (serviceUntouched())
simulateUserActionAsInStep2()
else
testServiceAsInStep5(reCreatedService)
}
@Test
fun testMethod2()
{
testMethod1()
}
总而言之,似乎没有很好的选择,但这似乎是一个足够普遍的问题。我是否缺少一些明显的解决方案?