@WebMvcTest
是 Spring Boot 提供的一个用于测试 Spring MVC 控制器的注解。它专注于测试 Spring MVC 层的组件,如控制器、过滤器和拦截器,而不是整个 Spring 上下文。这对于测试 RESTful API 或 Web 控制器非常有用。
主要特点
-
限制上下文:
@WebMvcTest
只加载 Web 层的 Bean,例如控制器、@ControllerAdvice
、过滤器和拦截器。它不会加载服务层、数据访问层等组件,这样可以减少测试的上下文大小,提高测试的效率。 -
Mocking: 默认情况下,
@WebMvcTest
会自动配置MockMvc
,这是一个用于测试 Spring MVC 控制器的模拟对象。你可以使用MockMvc
来执行 HTTP 请求并验证响应,而不需要启动实际的 HTTP 服务。 -
组件扫描: 通过
@WebMvcTest
注解,你可以指定要测试的控制器(或控制器类的集合),并只扫描那些类。这使得测试更集中,避免加载不必要的组件。
使用示例
假设你有一个简单的控制器如下:
@RestController
public class MyController {
@GetMapping("/greet")
public ResponseEntity<String> greet() {
return ResponseEntity.ok("Hello, World!");
}
}
你可以用 @WebMvcTest
来测试它:
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
@WebMvcTest(MyController.class) // 仅加载 MyController
public class MyControllerTest {
@Autowired
private MockMvc mockMvc; // 自动配置的 MockMvc
@Test
public void testGreet() throws Exception {
mockMvc.perform(get("/greet"))
.andExpect(status().isOk())
.andExpect(content().string("Hello, World!"));
}
}
主要用途
- 控制器测试: 测试控制器的功能和行为,确保它们能够处理请求并返回预期的响应。
- 验证请求和响应: 使用
MockMvc
来模拟 HTTP 请求,并验证控制器的响应是否符合预期。
注意事项
- 依赖注入:
@WebMvcTest
不会加载服务层或数据访问层的 Bean。如果你的控制器依赖于这些 Bean,需要使用 Mockito 或其他工具进行模拟。 - 配置: 如果你需要测试控制器的配置(如自定义的
HandlerInterceptor
或WebMvcConfigurer
),可以通过@Import
注解将它们导入到测试上下文中。
总结
@WebMvcTest
是一个用于测试 Spring MVC 控制器的注解,只加载 Web 层的 Bean,并自动配置MockMvc
。- 它主要用于验证控制器的行为,模拟 HTTP 请求,并确保响应符合预期。
其他:
- @RunWith(SpringJUnit4ClassRunner.class)
- @SpringBootTest// 用于加载整个 Spring Boot 应用上下文,通常用于集成测试。
- @AutoConfigureMockMvc//它通常与 @SpringBootTest 一起使用,以便在加载整个 Spring 上下文的情况下进行 Web 层测试。
- @ExtendWith(SpringExtension.class)// 启用 Spring 的支持