【问题标题】:Spring Boot + Integration TestSpring Boot + 集成测试
【发布时间】:2020-02-25 03:17:18
【问题描述】:

我正在尝试为 Spring Boot 项目编写集成测试。不幸的是,我对实现感到困惑。

下面的示例代码 sn -p 试过了

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MainApplication.class)
@AutoConfigureMockMvc
public class PropertyControllerIT {

  @Autowired
  private MockMvc mockMvc;

  @Test
  public void sample_test() throws Exception {
    this.mockMvc.perform(post("/property")).andExpect(status().is2xxSuccessful());
  }
}

问题

  • 我需要有一个单独的MainClass 吗? @SpringBootApplication 注解支持集成测试?
  • 我们是创建模拟数据库还是覆盖数据库配置。如果是,我们如何覆盖配置
  • 我们是否应该为集成测试维护一个单独的目录,类似于javatest,如integration-test

【问题讨论】:

标签: java spring spring-boot integration-testing


【解决方案1】:
  • 您不需要创建任何其他带有注释的类 SpringBootApplication
  • 使用内存数据库(例如 H2)运行集成测试是一种很好的做法。您可以在test 目录内的resources 文件夹中创建一个新的application-test.properties 文件。为了使用覆盖属性,您可以使用test 配置文件运行测试。为了使用 test 运行测试,可以使用配置文件 @ActiveProfiles
  • 您可以将集成测试保存在与单元测试相同的 test 目录中,但它们可以位于单独的包中

【讨论】:

  • 那么我们是否应该使用相同的MainApplication.java 类并根据需要覆盖该属性?
  • 是的,MainApplication 应该在您测试时使用。顺便说一句,如果你想在测试上下文中拥有所有应用程序的 bean,你可以考虑使用@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
  • 好吧。感谢您的支持。问?如果我们使用MainApplication.java,它将使用课程中已经提到的数据库配置。我们如何覆盖这个值?