[Spring test] Test restTemplate Sample Code
2021.04.14
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class PostsApiControllerTest {
@LocalServerPort
private int port;
@Autowired
private TestRestTemplate restTemplate;
@Autowired
private PostsRepository postsRepository;
@After
public void tearDown() throws Exception {
postsRepository.deleteAll();
}
@Test
public void Posts_등록된다() throws Exception {
String title = "title";
String content = "content";
PostsSaveRequestDto requestDto = PostsSaveRequestDto.builder()
.title(title)
.content(content)
.author("author")
.build();
String url = "http://localhost:" + port + "/api/v1/posts";
ResponseEntity<Long> responseEntity = restTemplate.postForEntity(url, requestDto, Long.class);
assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(responseEntity.getBody()).isGreaterThan(0L);
List<Posts> all = postsRepository.findAll();
assertThat(all.get(0).getTitle()).isEqualTo(title);
assertThat(all.get(0).getContent()).isEqualTo(content);
}
}
Reference
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 / 이동욱 / 프리렉
TestRestTemplate
@SpringBootTest
와 TestRestTemplate
을 사용한다면 편리하게 웹 통합 테스트를 할 수 있다. TestRestTemplate
은 이름에서 알 수 있듯이 RestTemplate
의 테스트를 위한 버전입니다. @SpringBootTest
에서 Web Environment 설정을 하였다면 TestRestTemplate
은 그에 맞춰서 자동으로 설정되어 빈이 생성됩니다.
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class RestApiTest {
@Autowired
private TestRestTemplate restTemplate;
@Test
public void test() {
ResponseEntity<Article> response = restTemplate.getForEntity("/api/articles/1", Article.class);
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(response.getBody()).isNotNull();
...
}
}
기존에 컨트롤러를 테스트하는 데 많이 사용되던 MockMvc
와 어떤 차이가 있는지 궁금할 것입니다. 가장 큰 차이점이라면 Servlet Container를 사용하느냐 안 하느냐의 차이입니다. MockMvc
는 Servlet Container를 생성하지 않습니다. 반면, @SpringBootTest
와 TestRestTemplate
은 Servlet Container를 사용합니다. 그래서 마치 실제 서버가 동작하는 것처럼(물론 몇몇 빈은 Mock 객체로 대체될 수는 있습니다) 테스트를 수행할 수 있습니다. 또한, 테스트하는 관점도 서로 다릅니다. MockMvc
는 서버 입장에서 구현한 API를 통해 비즈니스 로직이 문제없이 수행되는지 테스트를 할 수 있다면, TestRestTemplate
은 클라이언트 입장에서 RestTemplate
을 사용하듯이 테스트를 수행할 수 있습니다.
출처: https://meetup.toast.com/posts/124
댓글을 작성해보세요.