41.3 测试Spring Boot程序

一个Spring Boot程序不过是Spring的一个ApplicationContext,所以为了测试它,除了通常对一个普通的Spring上下文所做的以外,您不必做任何特别的事情。不过要注意的一点是,外部属性、日志以及Spring Boot的其他功能仅在您使用SpringApplication来创建上下文时会默认安装。

Spring Boot提供了一个@SpringBootTest注解,当您需要Spring Boot的功能时,可以用其替代标准的spring-test@ContextConfiguration注解。该注解在测试用例中通过SpringApplication创建ApplicationContext

您可以使用@SpringBootTestwebEnvironment属性来进一步改进测试的运行方式:

  • MOCK —— 加载一个WebApplicationContext,并且提供一个模拟servlet环境。使用此注解时不会启动内置servlet容器。如果servlet的API不在您的类路径上,则此模式将在不被察觉下回退而创建常规非Web的ApplicationContext。可以与@AutoConfigureMockMvc一起使用,用于基于MockMvc的应用程序测试。
  • RANDOM_PORT —— 加载EmbeddedWebApplicationContext并提供一个真实的servlet环境。内置servlet容器在随机端口上启动并侦听。
  • DEFINED_PORT —— 加载EmbeddedWebApplicationContext并提供一个真实的servlet环境。内置servlet容器在指定的端口(即从application.properties中或默认端口8080)上启动并侦听。
  • NONE —— 使用SpringApplication加载ApplicationContext,但不提供任何servlet环境(模拟或其他)。

如果您的测试是@Transactional,则默认情况下将在每个测试方法结束时回滚事务。不过,由于使用RANDOM_PORTDEFINED_PORT隐式地提供了一个真实的servlet环境,所以HTTP客户端和服务器将在单独的线程中运行因而事务分离。在这种情况下,在服务器上启动的任何事务都不会回滚。


除了@SpringBootTest之外,还提供了许多其他注解来测试应用程序的更多特定部分。详见下文。


不要忘记将@RunWith(SpringRunner.class)添加到您的测试用例中,否则注解将被忽略。


书籍推荐