如何使用Mockito测试标注@ResponseStatus的void方法返回的HTTP状态
测试实现方案
你可以结合Spring Boot提供的MockMvc组件和Mockito完成Controller层单元测试,无需启动完整服务上下文,测试逻辑如下:
1. 测试类基础配置
import org.springframework.http.HttpStatus; import org.springframework.test.web.servlet.MockMvc; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.mock.mockito.MockBean; import com.fasterxml.jackson.databind.ObjectMapper; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.mockito.Mockito.verify; import static org.mockito.ArgumentMatchers.any; // 替换为你实际的Controller类名 @WebMvcTest(RestaurantController.class) public class RestaurantControllerTest { @Autowired private MockMvc mockMvc; // Mock掉Controller依赖的Service层,避免真实数据库操作 @MockBean private RestaurantService restaurantService; @Autowired private ObjectMapper objectMapper;
2. 正常调用场景测试方法
@Test public void create_WhenValidRequest_Returns201Created() throws Exception { // 构造合法的请求DTO,字段值要满足@Valid的校验规则 RestaurantCreationDTO validDTO = new RestaurantCreationDTO(); validDTO.setName("测试餐厅"); validDTO.setAddress("测试地址"); // 其他必填字段按你的业务规则赋值... // 执行POST请求,直接断言响应状态码 mockMvc.perform(post("/restaurant") // 替换为你实际的接口请求路径 .contentType("application/json") .content(objectMapper.writeValueAsString(validDTO))) .andExpect(status().isCreated()); // 验证返回201 CREATED状态码 // 可选:验证service层的create方法被正确调用1次 verify(restaurantService).create(any(RestaurantCreationDTO.class)); } }
补充说明
@WebMvcTest只会加载Controller层相关Bean,测试运行速度远快于完整服务启动测试- 你的接口为void返回类型,正常请求无响应体,只需断言
status().isCreated()即可验证@ResponseStatus注解生效 - 如果需要测试参数校验失败的场景,只需构造字段不合法的DTO,断言返回400状态码即可
内容的提问来源于stack exchange,提问作者user15599360
相关产品推荐
相关产品推荐

