Difference between MockMvc and RestTemplate in integration tests
As said in this
article you should use MockMvc
when you want to test Server-side of application:
Spring MVC Test builds on the mock request and response from
spring-test
and does not require a running servlet container. The main difference is that actual Spring MVC configuration is loaded through the TestContext framework and that the request is performed by actually invoking theDispatcherServlet
and all the same Spring MVC infrastructure that is used at runtime.
for example:
@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().mimeType("application/json"))
.andExpect(jsonPath("$.name").value("Lee"));
}}
And RestTemplate
you should use when you want to test Rest Client-side application:
If you have code using the
RestTemplate
, you’ll probably want to test it and to that you can target a running server or mock the RestTemplate. The client-side REST test support offers a third alternative, which is to use the actualRestTemplate
but configure it with a customClientHttpRequestFactory
that checks expectations against actual requests and returns stub responses.
example:
RestTemplate restTemplate = new RestTemplate();
MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate);
mockServer.expect(requestTo("/greeting"))
.andRespond(withSuccess("Hello world", "text/plain"));
// use RestTemplate ...
mockServer.verify();
also read this example
With MockMvc
, you're typically setting up a whole web application context and mocking the HTTP requests and responses. So, although a fake DispatcherServlet
is up and running, simulating how your MVC stack will function, there are no real network connections made.
With RestTemplate
, you have to deploy an actual server instance to listen for the HTTP requests you send.