使用MockMvc与Mockito测试Get接口返回结果不符的问题
问题分析与修复方案
问题根源
你在Mockito中配置orderService.getOrdersUserId(1)的返回值时,传入的是包含全部3条订单的完整列表,而非仅属于user_id=1的订单。这直接导致测试接口返回了全量数据,和实际接口的筛选逻辑不符。
修复步骤
- 准备仅包含目标用户(
user_id=1)订单的列表; - 将这个筛选后的列表作为
thenReturn的参数,替换原来的全量列表。
修复后的代码示例
// 直接初始化仅包含user_id=1的订单列表 List<Order> user1Orders = new ArrayList<>(); Order order1 = new Order(1, 1, 11.0, "Pending"); Order order3 = new Order(3, 1, 13.0, "Shipped"); user1Orders.add(order1); user1Orders.add(order3); // 也可以通过流从全量列表过滤(如果需要保留全量列表的话) // List<Order> user1Orders = orderList.stream() // .filter(order -> order.getUser_id() == 1) // .collect(Collectors.toList()); // 配置mock方法返回筛选后的列表 Mockito.when(orderService.getOrdersUserId(1)).thenReturn(user1Orders); mockMvc.perform(MockMvcRequestBuilders.get("/api/order/getOrders/user/{user_id}", 1).contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andDo(print()) .andExpect(jsonPath("$", hasSize(2)));
补充说明
单元测试中,orderService是被mock的对象,它不会执行实际的筛选逻辑——你给它指定什么返回值,它就会返回什么。所以必须手动构造符合预期的返回数据,才能和接口的实际行为匹配,通过断言校验。
内容的提问来源于stack exchange,提问作者Kim Gordon
相关产品推荐
相关产品推荐

