一个Spring Boot程序不过是Spring的一个ApplicationContext
,所以为了测试它,除了通常对一个普通的Spring上下文所做的以外,您不必做任何特别的事情。不过要注意的一点是,外部属性、日志以及Spring Boot的其他功能仅在您使用SpringApplication
来创建上下文时会默认安装。
Spring Boot提供了一个@SpringBootTest
注解,当您需要Spring Boot的功能时,可以用其替代标准的spring-test
的@ContextConfiguration
注解。该注解在测试用例中通过SpringApplication
创建ApplicationContext
。
您可以使用@SpringBootTest
的webEnvironment
属性来进一步改进测试的运行方式:
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_PORT
或DEFINED_PORT
隐式地提供了一个真实的servlet环境,所以HTTP客户端和服务器将在单独的线程中运行因而事务分离。在这种情况下,在服务器上启动的任何事务都不会回滚。
除了
@SpringBootTest
之外,还提供了许多其他注解来测试应用程序的更多特定部分。详见下文。
不要忘记将
@RunWith(SpringRunner.class)
添加到您的测试用例中,否则注解将被忽略。