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

Spring有2个MockMvc设置:

  1. 独立设置
  2. Web应用程序上下文设置

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

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


答案 1

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

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

值得注意的摘录:

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

...

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

...

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

...

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

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

问候

Sam(Spring TestContext Framework的作者))


答案 2

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

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

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


推荐