集成测试中 MockMvc 和 RestTemplate 之间的区别

MockMvcRestTemplate都用于与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());

答案 1

本文所述,当您想要测试应用程序的服务器端时,应使用:MockMvc

Spring MVC 测试基于模拟请求和响应构建,不需要正在运行的 servlet 容器。主要区别在于,实际的 Spring MVC 配置是通过 TestContext 框架加载的,并且请求是通过实际调用运行时使用的所有相同的 Spring MVC 基础结构来执行的。spring-testDispatcherServlet

例如:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration("servlet-context.xml")
public class SampleTests {

  @Autowired
  private WebApplicationContext wac;

  private MockMvc mockMvc;

  @Before
  public void setup() {
    this.mockMvc = webAppContextSetup(this.wac).build();
  }

  @Test
  public void getFoo() throws Exception {
    this.mockMvc.perform(get("/foo").accept("application/json"))
        .andExpect(status().isOk())
        .andExpect(content().contentType("application/json"))
        .andExpect(jsonPath("$.name").value("Lee"));
  }}

当您想要测试 Rest 客户端应用程序时,您应该使用:RestTemplate

如果你有使用 的代码,你可能想要测试它,你可以以正在运行的服务器为目标或模拟 RestTemplate。客户端 REST 测试支持提供了第三种选择,即使用实际,但使用自定义配置它,该自定义根据实际请求检查期望并返回存根响应。RestTemplateRestTemplateClientHttpRequestFactory

例:

RestTemplate restTemplate = new RestTemplate();
MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate);

mockServer.expect(requestTo("/greeting"))
  .andRespond(withSuccess("Hello world", "text/plain"));

// use RestTemplate ...

mockServer.verify();

另请阅读此示例


答案 2

使用 ,您通常设置整个 Web 应用程序上下文并模拟 HTTP 请求和响应。因此,尽管假的堆栈已启动并运行,模拟MVC堆栈的功能,但没有建立真正的网络连接。MockMvcDispatcherServlet

使用 ,您必须部署一个实际的服务器实例来侦听您发送的 HTTP 请求。RestTemplate


推荐