SpringBoot 测试实践 - 2:单元测试与集成测试
上一节:SpringBoot 测试实践 - 1:常用的工具 下一节:SpringBoot 测试实践 - 3:@MockBean、@SpyBean 、提升测试运行速度、Testcontainer 单元测试 vs. 集成测试 只编写单测,无法测试方法之间的集成情况,而且某些需求可能会修改多个方法,这可能会影响方法对应的单测,涉及到大量的相关单测的修改,这样的维护成本很高 可以把重心放在完善集成测试上,专注从外部判断程序是否符合预期。对于一些非常重要的方法,增加单元测试可以减轻集成测试排查错误的难度 先导知识可以参考上一节:SpringBoot 测试实践 - 1:常用的工具 SpringBootTest 和 MockMvc 进行集成测试 从 Spring Boot 2.1 开始 @ExtendWith({SpringExtension.class}) 作为元注解包含在 Spring Boot 测试注解中,例如 @DataJpaTest、@WebMvcTest 和 @SpringBootTest,所以我们不用重复添加 @ExtendWith({SpringExtension.class}) 注解 HelloWorld 测试 使用 SpringBoot 一个简单的 HelloWorld 案例,通过 @SpringBootTest 可以在测试环境中加载整个 Spring 应用程序上下文,@SpringBootTest 注解会扫描应用程序的主配置类,并加载所有的 Bean(包括依赖的 Bean)到测试上下文中。这样,测试中就可以使用完整的 Spring 功能,包括依赖注入、AOP、事务管理等 使用 @AutoConfigureMockMvc 自动配置 MockMvc,通过 MockMvc 可以模拟 HTTP 请求,并对响应的结果进行断言和验证 import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; @AutoConfigureMockMvc @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class MySpringBootTest { @Autowired private MockMvc mockMvc; // 注入 MockMvc @Test public void testHelloWorld() throws Exception { // 发送 GET 请求 mockMvc.perform(MockMvcRequestBuilders.get("/hello") // 设置请求头 .accept(MediaType.APPLICATION_JSON)) // 验证响应状态码 .andExpect(MockMvcResultMatchers.status().isOk()) // 验证响应内容 .andExpect(MockMvcResultMatchers.content().string("Hello, World!")); } } 涉及数据层的测试:H2 部分操作涉及到数据库,一般都会引入数据层的依赖,在对应的 HTTP 请求后,对响应体和数据库数据进行断言和验证,就像下面这样: ...