SpringBoot集成测试使用jsonPath断言失败问题求助
SpringBoot Controller集成测试JSON路径断言失败问题解决
问题场景
Postman调用/product/{id}接口可正常返回如下JSON:
{ "pid": 201, "productName": "Mobile", "quantity": 1, "price": 20000 }
但执行集成测试时抛出断言错误:
java.lang.AssertionError: No value at JSON path "$.productName"
被测Controller方法
@GetMapping("/product/{id}") public Product getproduct(@PathVariable int id){ return productRepository.findById(id).orElse(null); }
测试代码
@ExtendWith(SpringExtension.class) @WebMvcTest(OrderController.class) class OrderControllerTest { @Autowired private MockMvc mvc; @MockBean private ProductRepository productRepository; @MockBean private CustomerRepository customerRepository; @Test void getproduct() throws Exception { mvc.perform(get("/product/{pid}","201")).andDo(print()) .andExpect(status().isOk()) .andExpect(jsonPath("$.productName").value("Mobile")); } }
原因分析
- MockRepository未模拟返回值:测试中使用
@MockBean注解的ProductRepository默认返回null,未设置findById方法的模拟返回值,导致Controller返回null,响应体为空,无法匹配$.productName路径。 - 测试类目标Controller错误:
@WebMvcTest(OrderController.class)指定的是OrderController,但被测接口属于Product相关Controller,可能导致Spring未加载目标Controller,请求未被正确处理。 - 路径变量名不匹配:Controller路径是
/product/{id},测试中写的是/product/{pid},虽不影响路径匹配,但易造成混淆。
解决方案
1. 模拟Repository返回数据
在测试方法中,用Mockito指定productRepository.findById的返回值:
@Test void getproduct() throws Exception { // 构造模拟的Product对象 Product mockProduct = new Product(); mockProduct.setPid(201); mockProduct.setProductName("Mobile"); mockProduct.setQuantity(1); mockProduct.setPrice(20000); // 模拟Repository方法返回 when(productRepository.findById(201)).thenReturn(Optional.of(mockProduct)); mvc.perform(get("/product/{id}","201")).andDo(print()) .andExpect(status().isOk()) .andExpect(jsonPath("$.productName").value("Mobile")); }
2. 修正测试类的@WebMvcTest目标类
将测试类的@WebMvcTest注解改为对应被测的ProductController:
@ExtendWith(SpringExtension.class) @WebMvcTest(ProductController.class) class ProductControllerTest { // 其余代码保持不变 }
3. 统一路径变量名(可选)
将测试中的路径变量名与Controller保持一致,避免混淆:
mvc.perform(get("/product/{id}","201"))
关键说明
@MockBean修饰的Repository不会自动返回真实数据,必须通过Mockito.when()手动指定方法返回值,否则Controller会返回null,导致响应体无JSON字段。@WebMvcTest只会加载指定的Controller类及其相关组件,若指定错误,被测接口将无法被Spring MVC处理。
内容的提问来源于stack exchange,提问作者user20112858
相关产品推荐
相关产品推荐

