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

时间:2015-08-26 09:59:06

标签: java spring spring-mvc spring-test spring-test-mvc

Spring为MockMvc设置了两个设置:

  1. 独立设置
  2. WebApplicationContext设置
  3. 一般来说,MockMvc用于什么样的测试?单位还是整合?还是两个?

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

2 个答案:

答案 0 :(得分:31)

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

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

值得注意的摘录:

  

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

...

  

另一方面,“standaloneSetup”更靠近一个单位   测试。它一次测试一个控制器,控制器可以   手动注入模拟依赖项,它不涉及   加载Spring配置。这些测试更注重风格和   让它更容易看出正在测试哪个控制器,无论是否   特定的Spring MVC配置需要工作,等等。该   “standaloneSetup”也是编写临时测试的一种非常方便的方法   验证某些行为或调试问题。

...

  

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

...

  

Spring MVC Test中提供的选项是不同的停止   从经典单元扩展到完全集成测试。确定没有   Spring MVC Test中的选项是经典的单元测试,但它们是一个   离它越来越近了。例如,您可以隔离服务层   将模拟注入控制器,然后进行网络测试   只通过DispatcherServlet和实际的Spring层   配置,就像你可能测试数据库层一样   隔离上面的层。或者您可以使用独立版   设置一次专注于一个控制器并手动提供   使其运作所需的配置。

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

此致

Sam( Spring TestContext Framework的作者

答案 1 :(得分:0)

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

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

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