【问题标题】:Spring Boot Application cannot run integration tests for 2 controllersSpring Boot 应用程序无法为 2 个控制器运行集成测试
【发布时间】:2020-08-13 18:29:41
【问题描述】:

我有一个使用 SpringBoot 2.1.7 用 Ja​​va 编写的 REST API。 它有 2 个控制器,每个控制器都有集成测试。 控制器位于同一控制器文件夹中的单独文件中

每个控制器的集成测试也在单独的文件中。 如果我注释掉一组控制器测试,则集成测试成功。 但是,如果我尝试为两个控制器运行所有集成测试,则会出现多个故障并出现相同的错误:

java.lang.IllegalStateException:配置错误:发现测试类 [com.fedex.ground.transportation.fxglhlschedulesvc.controller.ITFacilityController] 的多个 @BootstrapWith 声明。ITFacilityController]

java.lang.IllegalStateException:配置错误:发现测试类 [com.fedex.ground.transportation.fxglhlschedulesvc.controller.ITScheduleController] 的多个 @BootstrapWith 声明。ITScheduleController]

这似乎是一个配置问题。 这就是我配置测试文件的方式: 对于设施控制器

@ActiveProfiles("local")
@AutoConfigureMockMvc
@SpringBootTest(classes = {FxgLhlScheduleSvcApplication.class, RedisConfig.class})

对于调度控制器

@ActiveProfiles("local")
@AutoConfigureMockMvc
@SpringBootTest(classes = FxgLhlScheduleSvcApplication.class)

我尝试添加这些配置注释,但得到相同的错误:

@WebMvcTest(ScheduleController.class)
@ContextConfiguration(classes=FxgLhlScheduleSvcApplication.class)

@WebMvcTest(FacilityController.class)
@ContextConfiguration(classes = {FxgLhlScheduleSvcApplication.class, RedisConfig.class})

假设在不同文件中的 2 个控制器的配置注释是什么。 控制器之间根本没有关联。

【问题讨论】:

  • 在其中一项测试中尝试@DirtiesContext
  • 成功了!你能把它放在答案中,以便我可以检查作为答案。这意味着什么?我也可以谷歌
  • 你可以试试不包括FxgLhlScheduleSvcApplication吗?如果您包含主要的 @SpringBootApplication,它将初始化所有 bean,这对于控制器测试来说不是您想要的。

标签: java spring spring-boot


【解决方案1】:

集成测试使用相同的 ApplicationContext(除非明确设置为不使用)。问题在于其中一个测试可以在上下文中进行更改,这会影响其他集成测试,例如更改某些 bean 的状态。

出于这个原因,有一个注释@DirtiesContext 在此特定测试之后恢复/清除对上下文的影响。

此注解计算量大,因此您应该仅在必要时使用它。

【讨论】:

    猜你喜欢
    • 2019-05-02
    • 2020-04-25
    • 1970-01-01
    • 2018-03-25
    • 2020-02-10
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多