Spring 的 MockMvc 是用于单元测试还是集成测试?

Posted

技术标签:

【中文标题】Spring 的 MockMvc 是用于单元测试还是集成测试?【英文标题】:Are Spring's MockMvc used for unit testing or integration testing? 【发布时间】:2015-11-20 07:23:27 【问题描述】:

Spring 有两个 MockMvc 设置:

    独立设置 WebApplicationContext 设置

一般来说,MockMvc 用于什么样的测试?单元还是集成?还是两者都有?

我说的对吗?使用独立设置(在 Spring 的应用程序上下文之外运行)允许您编写单元测试,而使用 WebApplicationContext 设置您可以编写集成测试?

【问题讨论】:

【参考方案1】:

我会说这两种方法都用于集成测试,但独立会强制您指定要测试的控制器。

WebApplicationContext 设置正在加载整个上下文,因此您不必关心服务于例如 /people POST 请求的特定控制器在哪里。

因此,我建议使用 WebApplicationContext 设置来根据应用程序需要使用的接口来测试您的 REST API。您无需将测试与实际代码结合起来,然后+您正在记录应用程序的行为方式。

【讨论】:

【参考方案2】:

这两种形式实际上都是集成测试,因为您正在测试代码与 Spring DispatcherServlet 和支持基础设施的集成。区别在于幕后使用的支持基础设施的数量。

详细信息记录在 Spring 参考手册中。

Server-Side Tests Setup Options Difference With End-to-End Integration Tests

值得注意的摘录:

“webAppContextSetup”加载实际的 Spring MVC 配置 导致更完整的集成测试。由于TestContext 框架缓存加载的 Spring 配置,有助于保持 即使添加了更多测试,测试也会快速运行。此外,您可以 通过 Spring 配置将模拟服务注入控制器,在 以便继续专注于测试 Web 层。

...

另一方面,“standaloneSetup”更接近一个单元 测试。它一次测试一个控制器,控制器可以是 手动注入mock依赖,不涉及 加载 Spring 配置。这样的测试更侧重于风格和 更容易查看正在测试哪个控制器,无论是否有 需要特定的 Spring MVC 配置才能工作,依此类推。这 “standaloneSetup”也是编写临时测试的一种非常方便的方式 验证某些行为或调试问题。

...

就像集成与单元测试一样,没有对错之分 回答。使用“standaloneSetup”确实意味着需要一些 额外的“webAppContextSetup”测试来验证 Spring MVC 配置。或者,您可以决定使用 “webAppContextSetup”并始终针对实际的 Spring MVC 进行测试 配置。

...

Spring MVC Test 中提供的选项在 从经典单元扩展到完整的集成测试。可以肯定的是没有 Spring MVC Test 中的选项是经典的单元测试,但它们是 离它更近一点。例如,您可以隔离服务层 将模拟注入控制器,然后您正在测试网络 仅通过 DispatcherServlet 和实际的 Spring 层 配置,就像您可能测试数据库层一样 隔离上面的层。或者你可以使用独立的 设置一次只关注一个控制器并手动提供 使其工作所需的配置。

如有疑问,我建议您先阅读参考手册,然后再在此处发布问题。 ;)

问候,

Sam(Spring TestContext 框架的作者

【讨论】:

以上是关于Spring 的 MockMvc 是用于单元测试还是集成测试?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot Rest控制器单元测试

无标题

无标题

无标题

Spring MockMvc 和异步控制器的 HTTP 状态码

为啥 Spring MockMvc 结果不包含 cookie?