java - 单元测试基于 Spring Boot 的 REST 端点,它返回按给定方向排序的对象集合
问题描述
我是弹簧靴的新手,仍在学习。如果我要问一个无关紧要的问题,请多多包涵。我已经看到类似下面的代码,据我了解,此代码本质上是根据给定的排序顺序 ASC 或 DESC 搜索一些记录并返回排序的结果集。我们真的需要编写一个单元测试来验证rest控制器序列化的结果集的顺序还是你认为单元测试的排序行为不属于控制器级别的责任?非常感谢您的建议和想法。
@RestController
@RequestMapping
@RequiredArgsConstructor
public class OrderController {
private final OrderService orderService;
@GetMapping("/orders")
public ResponseEntity<List<Order>> getAllOrders(@RequestParam(required = false) String direction){
return ResponseEntity.ok(orderService.getAllOrdersSortedByName(direction));
}
}
如果我们用模拟服务调用行为编写如下的单元测试,它可以被认为是一个有意义的测试用例吗?
@Test
void findAllOrderDesc() {
Order o1 = Order.id(1).name("A").build();
Order o2 = Order.id(2).name("B").build();
when(orderService.getAllOrdersSortedByName(anyString())).thenReturn(List.of(o2,o1));
mockMvc.perform(get("/orders?direction=DESC"))
.andExpect(status().isOk())
.andExpect(jsonPath("$",hashSize(2)))
.andExpect(jsonPath("$.[0].name",is("B")))
.andExpect(jsonPath("$.[1].name",is("A")));
}
解决方案
在我看来,您应该测试 Controller 端点,就好像您不知道它基本上是委托给服务一样。
鉴于您正在模拟服务响应,那么您至少应该确认 JSON 具有预期顺序的元素。话虽如此,您的测试确实有意义(您并没有真正测试排序功能本身,但您正在测试 JSON 序列化,假设 Service 已经以正确的排序响应)。
推荐阅读
- flutter - Unwanted animation while scrolling down the ListView.builder in Flutter
- html - Display Ninja Tables meta data at the top of the table? Or is there a way to hide the table completely until fully loaded?
- javascript - Reactjs 状态不渲染以更新 DOM
- botframework - Teams 应用程序未显示在我的移动设备上
- google-cloud-platform - 需要使用 gcloud 或 shell 脚本从 excel 中读取值
- python - 如何抑制 QWebEngineView 错误的控制台输出?
- java - IntelliJ 无法识别 Scala 中的 TypeTag
- node.js - 在 MERN 堆栈中以 base64 格式存储图像
- php - 未定义索引:用户名、密码 PHP
- linux - 如何在没有 STDIN 和 STDOUT 的情况下从 c 执行 bash 脚本