MockMvc和RestTemplate都用于Spring和JUnit的集成测试。
问题是:它们之间有什么区别,什么时候我们应该选择一个
以下是这两种选择的示例:
//MockMVC example
mockMvc.perform(get("/api/users"))
.andExpect(status().isOk())
(...)
//RestTemplate example
ResponseEntity<User> entity = restTemplate.exchange("/api/users",
HttpMethod.GET,
new HttpEntity<String>(...),
User.class);
assertEquals(HttpStatus.OK, entity.getStatusCode());
3条答案
按热度按时间kuhbmx9i1#
如this文章所述,当您希望测试应用程序的服务器端时,应使用
MockMvc
:Spring MVC Test构建在来自
spring-test
的模拟请求和响应上,不需要运行servlet容器,主要区别在于实际的Spring MVC配置是通过TestContext框架加载的,而请求是通过实际调用DispatcherServlet
和运行时使用的所有相同的Spring MVC基础设施来执行的。例如:
当您想要测试Rest客户端应用程序时,应该使用
RestTemplate
:如果您有使用
RestTemplate
的代码,您可能希望测试它,并且您可以将目标定位到正在运行的服务器或模拟RestTemplate。客户端REST测试支持提供了第三种选择,即使用实际的RestTemplate
,但使用自定义ClientHttpRequestFactory
配置它,该ClientHttpRequestFactory
将根据实际请求检查预期并返回存根响应。示例:
也读取this example
ubof19bj2#
使用
MockMvc
时,您通常要设置整个Web应用程序上下文并模拟HTTP请求和响应,因此,尽管一个假的DispatcherServlet
已启动并运行,模拟MVC堆栈的工作方式,但并没有建立真实的的网络连接。RestTemplate
可以很方便地用一个定制的ClientHttpRequestFactory
初始化。实现通常创建ClientHttpRequest
对象来打开实际的TCP/HTTP连接。但你不必这样做。你可以提供一个模拟实现,在那里你可以做任何你想做的事情。事实上,这就是MockRestServiceServer
实用程序的操作方式,你可以使用它。u91tlkcl3#
可以同时使用RestTemplate和MockMvc!
如果您有一个单独的客户机,在那里您已经完成了繁琐的Java对象到URL的Map以及与Json之间的转换,并且您希望在MockMVC测试中重用它,那么这是非常有用的。
下面是如何做到这一点: