spring 集成测试中MockMvc和RestTemplate的区别

6g8kf2rb  于 2023-02-18  发布在  Spring
关注(0)|答案(3)|浏览(180)

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());
kuhbmx9i

kuhbmx9i1#

this文章所述,当您希望测试应用程序的服务器端时,应使用MockMvc
Spring MVC Test构建在来自spring-test的模拟请求和响应上,不需要运行servlet容器,主要区别在于实际的Spring MVC配置是通过TestContext框架加载的,而请求是通过实际调用DispatcherServlet和运行时使用的所有相同的Spring MVC基础设施来执行的。
例如:

@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的代码,您可能希望测试它,并且您可以将目标定位到正在运行的服务器或模拟RestTemplate。客户端REST测试支持提供了第三种选择,即使用实际的RestTemplate,但使用自定义ClientHttpRequestFactory配置它,该ClientHttpRequestFactory将根据实际请求检查预期并返回存根响应。
示例:

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

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

// use RestTemplate ...

mockServer.verify();

也读取this example

ubof19bj

ubof19bj2#

使用MockMvc时,您通常要设置整个Web应用程序上下文并模拟HTTP请求和响应,因此,尽管一个假的DispatcherServlet已启动并运行,模拟MVC堆栈的工作方式,但并没有建立真实的的网络连接。
RestTemplate可以很方便地用一个定制的ClientHttpRequestFactory初始化。实现通常创建ClientHttpRequest对象来打开实际的TCP/HTTP连接。但你不必这样做。你可以提供一个模拟实现,在那里你可以做任何你想做的事情。事实上,这就是MockRestServiceServer实用程序的操作方式,你可以使用它。

u91tlkcl

u91tlkcl3#

可以同时使用RestTemplate和MockMvc!
如果您有一个单独的客户机,在那里您已经完成了繁琐的Java对象到URL的Map以及与Json之间的转换,并且您希望在MockMVC测试中重用它,那么这是非常有用的。
下面是如何做到这一点:

@RunWith(SpringRunner.class)
@ActiveProfiles("integration")
@WebMvcTest(ControllerUnderTest.class)
public class MyTestShould {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void verify_some_condition() throws Exception {

        MockMvcClientHttpRequestFactory requestFactory = new MockMvcClientHttpRequestFactory(mockMvc);
        RestTemplate restTemplate = new RestTemplate(requestFactory);

        ResponseEntity<SomeClass> result = restTemplate.getForEntity("/my/url", SomeClass.class);

        [...]
    }

}

相关问题