다음은 TestRestTemplate 링크 를 번역하면서 공부한 글입니다. 🙌


기존에 RestTemplate을 활용하여 통합테스트를 많이 했을 것이다. 스프링부트에는 굉장히 비슷하게 동작하는 TestRestTemplate이 있다. 두가지 모두 통합테스트에서 유용하며 HTTP API를 다룰 수 있다. TestRestTemplate의 예시를 한번 들여다보자.

TestRestTemplate testRestTemplate = new TestRestTemplate();
ResponseEntity<String> response = testRestTemplate.
  getForEntity(FOO_RESOURCE_URL + "/1", String.class);
 
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));

RestTemplate과 거의 유사한 형테를 지니고 있다. 하지만 TempRestTemplate은 RestTemplate을 확장하지 않으며 몇가지 다른 기능을 제공한다.


🌩 TestRestTemplate은 무엇이 다를까?

1. Auth Credentials을 설정할 수 있는 생성자를 제공한다.

TestRestTemplate을 생성할 때 기본 authentication을 설정하여 생성할 수 있다. 그러면 해당 인스턴스를 활용한 모든 요청이 해당 credential이 적용된 채로 수행된다.

TestRestTemplate testRestTemplate
 = new TestRestTemplate("user", "passwd");
ResponseEntity<String> response = testRestTemplate.
  getForEntity(URL_SECURED_BY_AUTHENTICATION, String.class);
 
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));

2. HttpClientOption을 제공하는 생성자를 제공한다.

기타 다른 Http 옵션등을 설정할 수 있다. Enum을 제공하며 ENABLE_COOKIES, ENABLE_REDIRECTS, SSL 이 있다.

TestRestTemplate testRestTemplate = new TestRestTemplate("user", 
  "passwd", TestRestTemplate.HttpClientOption.ENABLE_COOKIES);
ResponseEntity<String> response = testRestTemplate.
  getForEntity(URL_SECURED_BY_AUTHENTICATION, String.class);
 
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK))

3. 새로운 메소드

생성자 뿐 아니라 withBasicAuth() 라는 메소드를 통해서 authentication을 추가할 수도 있다.

TestRestTemplate testRestTemplate = new TestRestTemplate();
ResponseEntity<String> response = testRestTemplate.withBasicAuth(
  "user", "passwd").getForEntity(URL_SECURED_BY_AUTHENTICATION, 
  String.class);
 
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));

🌩 RestTemplate과 TestRestTemplate 둘다 사용하기

TestRestTemplate은 RestTemplate의 wrapper로 활용될 수 있다. 예를 들어 이미 restTemplate으로 구현된 레거시 코드가 있다면 wrapper로 TestRestTemplate으로 전환해 손쉽게 사용이 가능하다.

RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder();
restTemplateBuilder.configure(restTemplate);
TestRestTemplate testRestTemplate = new TestRestTemplate(restTemplateBuilder);
ResponseEntity<String> response = testRestTemplate.getForEntity(
  FOO_RESOURCE_URL + "/1", String.class);
 
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));

🌩 결론

TestRestTemplate은 단순히 RestTemplate의 확장버전이 아니다. 오히려 더 간단하게 통합테스트를 할 수 있고 유용하게 authentication을 설정할 수 있는 대체안이다. Apache Http 클라이언트를 커스텀할 수 있으며 RestTemplate의 wrapper 클래스로도 활용될 수 있다.