You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"));
    }
}

原因分析

  1. MockRepository未模拟返回值:测试中使用@MockBean注解的ProductRepository默认返回null,未设置findById方法的模拟返回值,导致Controller返回null,响应体为空,无法匹配$.productName路径。
  2. 测试类目标Controller错误:@WebMvcTest(OrderController.class)指定的是OrderController,但被测接口属于Product相关Controller,可能导致Spring未加载目标Controller,请求未被正确处理。
  3. 路径变量名不匹配: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:05:23