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



我看过一些教程,不太确定如何使用JUnit 5为我的控制器方法编写测试用例。我已经阅读了TestRestTemplate和Mock函数,但仍然不知道如何开始。我使用的是MySQL数据库,该应用程序包含两个类Product和Feedback,它有一个OneToMany关系,拥有的实体是Feedback。

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

@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层

对于这样的测试,您通常会嘲笑控制器的所有合作者(在您的情况下是您的dao(。使用MockMvc,您可以针对SpringBoot为您创建的模拟Servlet环境触发请求。通过这种方式,您可以确保您的控制器端点得到适当的保护(由Spring Security(,您的路径变量和查询参数按预期映射,您返回正确的HTTP响应和标头,您的Model包含默认属性,等等。

您可以在本指南中找到有关如何使用MockMvc编写测试的更多信息。

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

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

因此,作为一般建议,您应该同时进行这两种测试,并至少确保您的重要快乐路径在集成测试中按预期运行。对于控制器的更多低级检查,@WebMvcTest注释非常方便。

最新更新