MockMvc 基于模块中的 Servlet API 模拟实现构建,不依赖于正在运行的容器。因此,有
与完整的端到端集成测试相比,存在一些差异。
客户端和正在运行的实时服务器。spring-test
考虑这个问题的最简单方法是从空白开始。
无论您向其中添加什么,请求都会变成什么。可能会让你措手不及的事情
默认情况下没有上下文路径;没有cookie;没有转发,
错误或异步调度;因此,没有实际的 JSP 渲染。相反
“转发”和“重定向”URL 保存在 和
满怀期待地断言。MockHttpServletRequest
jsessionid
MockHttpServletResponse
这意味着,如果使用 JSP,则可以验证请求所指向的 JSP 页面
转发,但不呈现 HTML。换言之,不调用 JSP。注意
但是,所有其他不依赖转发的渲染技术,例如
Thymeleaf 和 Freemarker,按预期将 HTML 呈现到响应正文。情况也是如此
用于通过方法呈现 JSON、XML 和其他格式。@ResponseBody
或者,您可以考虑从以下位置获得完整的端到端集成测试支持
带有 .请参阅 Spring Boot 参考指南。@SpringBootTest
每种方法各有利弊。Spring MVC Test 中提供的选项包括
从经典单元测试到完全集成测试,规模上的不同站点。成为
当然,Spring MVC Test 中没有一个选项属于经典单元的类别
测试,但他们离它更近一点。例如,您可以隔离 Web 图层
通过将模拟服务注入控制器,在这种情况下,您正在测试 Web
仅通过但具有实际 Spring 配置的层,因为您
可能会测试数据访问层,使其与上面的层隔离。此外,您可以使用
独立设置,一次专注于一个控制器,并手动提供
使其正常工作所需的配置。DispatcherServlet
使用 Spring MVC Test 时的另一个重要区别是,从概念上讲,这样的 测试是服务器端的,因此您可以检查使用了哪个处理程序,如果异常是 使用 HandlerExceptionResolver 处理,模型的内容是什么,绑定是什么 那里有错误,以及其他细节。这意味着写期望更容易, 因为服务器不是一个不透明的盒子,就像通过实际的 HTTP 测试它时一样 客户。这通常是经典单元测试的一个优点:它更容易编写, 原因,并调试,但不能取代对完全集成测试的需求。在 同时,重要的是不要忽视这样一个事实,即响应是最 要检查的重要事情。简而言之,这里有多种风格和策略的空间 即使在同一个项目中也进行测试。