SpringBoot测试类注解示例:

import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = GeneratorApp.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class UserTest {
}

1. @RunWith(SpringRunner.class)

目的: 为了让测试在Spring容器环境下执行。

@RunWith是JUnit的一个注解, 用来告诉JUnit不要使用内置的方式进行单元测试, 而应该使用指定的类做单元测试 对于Spring单元测试总是要使用 SpringRunner.class。

@RunWith 就是一个运行器,Test测试类需要使用Spring注入的类,例如@Autowired注入的类,使用@RunWith(SpringRunner.class)注解,注入的类才能实例化到Spring容器中,自动注入方能生效,否则会返回NullPointerExecption。

2. @SpringBootTest

目的: 加载ApplicationContext,启动spring容器。

@SpringBootTest注解是SpringBoot自1.4.0版本开始引入的一个用于测试的注解。

@SpringBootTest的classes 属性指向一个启动类或配置启动类

注:

  1. @SpringBootTest会自动检索程序的配置文件,无需显式指定classes属性;
  2. 检索顺序是从当前包开始,逐级向上查找被@SpringBootApplication或@SpringBootConfiguration注解的类。

SpringBootTest.WebEnvironment.RANDOM_PORT启动一个真实的web服务,会随机生成一个端口号。

一 般情况下,使用@SpringBootTest后,Spring将加载所有被管理的bean,基本等同于启动了整个服务,此时便可以开始功能测试。
由于web服务是最常见的服务,且我们对于web服务的测试有一些特殊的期望,所以@SpringBootTest注解中,给出了webEnvironment参数指定了web的environment,该参数的值一共有四个可选值:

  • MOCK:此值为默认值,该类型提供一个mock环境,可以和@AutoConfigureMockMvc或@AutoConfigureWebTestClient搭配使用,开启Mock相关的功能。注意此时内嵌的服务(servlet容器)并没有真正启动,也不会监听web服务端口。
  • RANDOM_PORT:启动一个真实的web服务,监听一个随机端口。
  • DEFINED_PORT:启动一个真实的web服务,监听一个定义好的端口(从application.properties读取)。
  • NONE:启动一个非web的ApplicationContext,既不提供mock环境,也不提供真实的web服务。

注:如果当前服务的classpath中没有包含web相关的依赖,spring将启动一个非web的ApplicationContext,此时的webEnvironment就没有什么意义了。

其他拓展:

  1. @SpringBootTest 用来指定SpringBoot应用程序的入口类, 该注解默认会根据包名逐级往上找, 一直找到一个SpringBoot主程序class为止, 然后启动该类为单元测试准备Spring上下文环境. Spring单元测试并不在每个测试方法前都移动一个全新的Spring上下文, 因为这样做太耗费时间, 而是会缓存上下文环境. 如果某个测试方法需要重新准备Spring上下文, 需要在该方法上加 @DirtiesContext 注解。
  2. 以Test结尾的注解,具有加载applicationContext的能力。