首页 > 解决方案 > 单元测试基于 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")));
                

}

标签: javaspring-bootunit-testingspring-restcontrollerspring-boot-test

解决方案


在我看来,您应该测试 Controller 端点,就好像您不知道它基本上是委托给服务一样。

鉴于您正在模拟服务响应,那么您至少应该确认 JSON 具有预期顺序的元素。话虽如此,您的测试确实有意义(您并没有真正测试排序功能本身,但您正在测试 JSON 序列化,假设 Service 已经以正确的排序响应)。


推荐阅读