17

Spring 有 2 个 MockMvc 设置:

  1. 独立设置
  2. WebApplicationContext 设置

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

我是否正确地说使用独立设置(在 Spring 的应用程序上下文之外运行)允许您编写单元测试,并且使用 WebApplicationContext 设置您可以编写集成测试?

4

2 回答 2

39

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

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

值得注意的摘录:

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

...

另一方面,“standaloneSetup”更接近于单元测试。它一次测试一个控制器,可以手动为控制器注入模拟依赖项,并且不涉及加载 Spring 配置。这样的测试在风格上更加集中,并且更容易查看正在测试哪个控制器,是否需要任何特定的 Spring MVC 配置才能工作,等等。“standaloneSetup”也是编写临时测试以验证某些行为或调试问题的一种非常方便的方法。

...

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

...

Spring MVC Test 中提供的选项是从经典单元到完整集成测试的不同阶段。可以肯定的是 Spring MVC Test 中的选项都不是经典的单元测试,但它们更接近它。例如,您可以使用注入控制器的模拟来隔离服务层,然后仅通过 DispatcherServlet 并使用实际的 Spring 配置来测试 Web 层,就像您可以隔离上面的层来测试数据库层一样。或者,您可以使用一次只专注于一个控制器的独立设置,并手动提供使其工作所需的配置。

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

问候,

Sam(Spring TestContext 框架的作者

于 2015-08-26T12:58:21.770 回答
0

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

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

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

于 2015-08-26T10:55:48.263 回答