본문 바로가기

Programing/Framework

[Spring] MockRestServiceServer를 이용한 RestTemplate 테스트

스프링에서는 이제 웹 클라이언트를 RestTemplate 대신 WebClient를 쓸 것을 이야기하고 있지만 아직 계속 쓰고 있다.

기능 테스트 코드를 작성하려고 한다.

결국은 클라이언트 코드는 RestTemplate을 주입받을 것인데, 테스트 코드에서 해당 요청을 Mocking을 할 수 있게 해주어야 한다.

 

스프링 프레임워크

스프링 프레임워크에서는 MockRestServiceServer 를 제공한다.

처음에 3.2.x 버전의 JavaDoc을 참고했다.

예제가 아래와 같이 되어있다.

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

mockServer.expect(requestTo("/hotels/42"))
 .andExpect(method(HttpMethod.GET))
 .andRespond(withSuccess("{ \"id\" : \"42\", \"name\" : \"Holiday Inn\"}", MediaType.APPLICATION_JSON));

Hotel hotel = restTemplate.getForObject("/hotels/{id}", Hotel.class, 42);
// Use the hotel instance...

mockServer.verify();

그런데 andExpect에 있는 부분에서 에러가 발생했다. (지금은 재현이 되지 않는다.)

 

현재 버전(current, 5.1.9)에서는 아래와 같이 예가 되어 있다. 뭐 빌더를 쓰는 것으로 바뀌었는데 큰 변화는 없다.

첫 expect에 manyTypes() 등이 추가 되었는데 별로 의미가 있지는 않다.

RestTemplate restTemplate = new RestTemplate()
MockRestServiceServer server = MockRestServiceServer.bindTo(restTemplate).build();

server.expect(manyTimes(), requestTo("/hotels/42"))
 .andExpect(method(HttpMethod.GET))
 .andRespond(withSuccess("{ \"id\" : \"42\", \"name\" : \"Holiday Inn\"}", MediaType.APPLICATION_JSON));

Hotel hotel = restTemplate.getForObject("/hotels/{id}", Hotel.class, 42);
// Use the hotel instance...

// Verify all expectations met
server.verify();

스프링 부트

스프링부트에는 TestRestTemplate 라는 것을 제공한다.

그런데 이것은 웹클라이언트 테스트가 아니라 서버에 대한 테스트이다.