如何使用Spring和JUnit5跨多个应用程序运行测试功能?

如何使用Spring和JUnit5跨多个应用程序运行测试功能?,spring,spring-boot,junit5,Spring,Spring Boot,Junit5,我的应用程序使用数据库中的数据进行一些重要的自定义初始化。我想做一个集成测试来测试这种行为。它将: 启动应用程序 与应用程序交互(例如,注册用户、模拟某些用户活动…) 关掉它 重新开始 验证应用程序是否已针对2正确初始化 因为我使用的是Spring引导框架,所以我不需要实际重新启动应用程序,我只需要销毁并重新创建我想要测试的bean。然而,我所考虑的任何方法都有一些可怕的缺陷 建议的@DirtiesContext注释和: 这对我不起作用,因为我必须有两种不同的测试方法。一个用于执行上述步骤2,另

我的应用程序使用数据库中的数据进行一些重要的自定义初始化。我想做一个集成测试来测试这种行为。它将:

  • 启动应用程序
  • 与应用程序交互(例如,注册用户、模拟某些用户活动…)
  • 关掉它
  • 重新开始
  • 验证应用程序是否已针对2正确初始化
  • 因为我使用的是Spring引导框架,所以我不需要实际重新启动应用程序,我只需要销毁并重新创建我想要测试的bean。然而,我所考虑的任何方法都有一些可怕的缺陷

  • 建议的
    @DirtiesContext
    注释和:
  • 这对我不起作用,因为我必须有两种不同的测试方法。一个用于执行上述步骤2,另一个用于执行步骤5。应用程序的启动和关闭将通过使用以下内容注释测试类来完成:

    @TestInstance(TestInstance.Lifecycle.PER_METHOD)
    @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
    
    但不幸的是,在Junit5中是这样的。所以我不能确定2是在5之前执行的

    我试图用
    @BeforeAll
    @beforeach
    对第一个测试方法进行注释,但这在某种程度上否定了
    @DirtiesContext
    注释的效果,并且应用程序上下文没有重置

  • 手动使用
    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需要重新创建,以便测试不会给出假阴性结果

  • 手动订购解决方案
  • 我可以添加一些额外的代码,让这两个方法按照指定的顺序完成我想要的任务:

    @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提供了对的支持。作为一个简短的介绍,您可能也会觉得很有用。