Spring的MockMvc是用于unit testing还是集成测试?

Spring有两个MockMvc设置:

  1. 独立设置
  2. WebApplicationContext设置

一般来说,MockMvc用于什么样的测试? 单位还是整合? 或两者?

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

这两种forms实际上都是集成测试,因为您正在测试代码与Spring DispatcherServlet和支持基础结构的集成。 不同之处在于幕后使用的支持基础架构的数量。

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

  • 服务器端测试
  • 设置选项
  • 与端到端集成测试的差异

值得注意的摘录:

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

另一方面,“standaloneSetup”更接近unit testing。 它一次测试一个控制器,控制器可以手动注入模拟依赖项,并且不涉及加载Spring配置。 这些测试更侧重于样式,并且更容易看到正在测试哪个控制器,是否需要任何特定的Spring MVC配置,等等。 “standaloneSetup”也是编写临时测试以validation某些行为或调试问题的一种非常方便的方法。

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

Spring MVC Test中提供的选项在从经典单元到完全集成测试的规模上是不同的停止。 确保Spring MVC Test中没有任何选项是经典的unit testing,但它们更接近它。 例如,您可以使用注入控制器的模拟隔离服务层,然后您只通过DispatcherServlet和实际的Spring配置测试Web层,就像您可以单独测试数据库层一样。 或者您可以使用一次集中在一个控制器上的独立设置,并手动提供使其工作所需的配置。

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

问候,

Sam( Spring TestContext Framework的作者

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

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

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