如何使用Spring和JUnit5跨多个应用程序运行测试功能?
我的应用程序使用数据库中的数据进行一些重要的自定义初始化。我想做一个集成测试来测试这种行为。它将:如何使用Spring和JUnit5跨多个应用程序运行测试功能?,spring,spring-boot,junit5,Spring,Spring Boot,Junit5,我的应用程序使用数据库中的数据进行一些重要的自定义初始化。我想做一个集成测试来测试这种行为。它将: 启动应用程序 与应用程序交互(例如,注册用户、模拟某些用户活动…) 关掉它 重新开始 验证应用程序是否已针对2正确初始化 因为我使用的是Spring引导框架,所以我不需要实际重新启动应用程序,我只需要销毁并重新创建我想要测试的bean。然而,我所考虑的任何方法都有一些可怕的缺陷 建议的@DirtiesContext注释和: 这对我不起作用,因为我必须有两种不同的测试方法。一个用于执行上述步骤2,另
@DirtiesContext
注释和:@TestInstance(TestInstance.Lifecycle.PER_METHOD)
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
但不幸的是,在Junit5中是这样的。所以我不能确定2是在5之前执行的
我试图用@BeforeAll
和@beforeach
对第一个测试方法进行注释,但这在某种程度上否定了@DirtiesContext
注释的效果,并且应用程序上下文没有重置
ApplicationContext
:@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需要重新创建,以便测试不会给出假阴性结果
@Test
fun testMethod1()
{
// If this method is being executed as the first one
if (serviceUntouched())
simulateUserActionAsInStep2()
else
testServiceAsInStep5(reCreatedService)
}
@Test
fun testMethod2()
{
testMethod1()
}
总而言之,似乎没有好的选择,但这似乎是一个足够普遍的问题。我是否遗漏了一些明显的解决方案?您的测试不是单元测试。这就是为什么JUnit给你带来如此困难的原因。如果您依赖于测试的顺序尝试不同的东西(restasured、Cucumber、MockMVC等),这取决于您的需求和appTBH的性质,我从未见过有人在单个测试类中启动、停止和重新启动整个应用程序。你真的需要吗?@SamBrannen是的,我想测试应用程序是否用非空数据库正确初始化。那么为什么不在加载
ApplicationContext
时对数据库执行一些SQL设置脚本呢?这就足够了。Spring Boot提供了对的支持。作为一个简短的介绍,您可能也会觉得很有用。