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

时间:2018-07-31 18:13:21

标签: spring spring-boot junit5

我的应用程序使用数据库中的数据进行一些简单的自定义初始化。我想进行集成测试以测试此行为。它会:

  1. 启动应用程序
  2. 与应用程序进行交互(例如,注册用户,模拟一些用户活动...)
  3. 闭嘴
  4. 重新启动
  5. 验证是否已针对2正确初始化了应用程序。

由于我使用的是Spring Boot框架,因此不需要实际重新启动应用程序,我所需要做的就是销毁并重新创建要测试的bean。但是,我认为的任何方法都有一些可怕的缺陷。

  1. 建议的herehere@DirtiesContext注释:

这对我不起作用,因为我必须有两种不同的测试方法。一个执行上述步骤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不会重置。

  1. 手动使用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,以使测试不给出错误的阴性结果。

  1. 手动订购解决方案

我可以添加一些额外的代码,使这两种方法以指定的顺序执行我想要的事情:

@Test
fun testMethod1()
{
    // If this method is being executed as the first one
    if (serviceUntouched()) 
        simulateUserActionAsInStep2()
    else
        testServiceAsInStep5(reCreatedService)
}

@Test
fun testMethod2()
{
    testMethod1()
}

总而言之,似乎没有很好的选择,但这似乎是一个足够普遍的问题。我是否缺少一些明显的解决方案?

0 个答案:

没有答案