如何使用 Spring-boot 为控制器方法编写 JUnit 5 测试用例

How to write a JUnit 5 test case for controller method using Spring-boot

我看了一些教程,但不太确定如何继续使用 JUnit 5 为我的控制器方法编写测试用例。我已经阅读了 TestRestTemplate 和 Mock 函数,但仍然感到茫然至于如何开始。我正在使用 MySQL 数据库,该应用程序包含两个 类 产品和反馈,它具有 OneToMany 关系,拥有实体为反馈。

如何为下面的方法编写测试?

    @PostMapping("/view/{id}")
    public ModelAndView addReview(@PathVariable("id") int id, @RequestParam("review") String review, HttpServletRequest request) {
        Product product = dao.findById(id).get();
        Feedback feedback = new Feedback(review);
        product.getFeedbacks().add(feedback);
        feedback.setProduct(product);
        dao.save(product);
        List<Feedback> fs = product.getFeedbacks();
        Collections.sort(fs, new FeedbackComparator());
        HttpSession session = request.getSession();
        session.setAttribute("fs", fs);
        return new ModelAndView("/view").addObject("product", product);
    }

有多种方法可以为您的 Spring MVC 控制器端点编写测试:

  1. 使用 @WebMvcTestMockMvc 来单独测试 您的 web-layer。

对于此类测试,您通常会模拟控制器的所有协作者(在您的情况下是您的 dao)。然后,使用 MockMvc,您可以针对 Spring Boot 为您创建的模拟 Servlet 环境发出请求。这样你就可以确保例如您的控制器端点受到适当保护(通过 Spring 安全性),您的路径变量和查询参数按预期映射,您返回正确的 HTTP 响应并且 headers,您的 Model 包含默认属性等

作为 this guide 的一部分,您可以找到有关如何使用 MockMvc 编写测试的更多信息。

  1. 使用 @SpringBootTest 填充您的整个应用程序上下文,启动真正的 Servlet 容器(例如 Tomcat)并使用 TestRestTemplateWebTestClient 调用您的端点HTTP.

此设置要求所有外部基础结构组件(数据库、消息传递 queues、外部系统等)在测试执行期间可用。这通常需要相当长的时间,而且此类测试不如第一个变体快。 Testcontainers 在这里可以帮到你很多。这样您就可以确保整个用例按预期工作并为您的应用程序编写集成测试。

因此,作为一般性建议,您应该同时进行这两种测试,并且至少确保您的重要 happy-paths 通过集成测试按预期工作。对于控制器的更多 low-level 检查,@WebMvcTest 注释非常方便。