King of Stock

[test] TestRestTemplate 본문

IT 기술

[test] TestRestTemplate

king of stock 2019. 7. 7. 10:21

Pet 프로젝트에 RestController를 통합 테스트 하기 위해 기존에는 주로 MockMvc 사용해서 구현을 많이 했었다. 테스트와 관련된 내용을 좀 찾아보고자 spring-boot test 문서를 보던중 Testing with a running server 발견하고 테스트 해보니 MockMvc로 하는거보다 편해서 앞으로 이걸 사용하려고 결정했다.

먼저 기존에 했던 방식의 테스트 코드를 보면 다음과 같다. 내가 느끼기에는 너무 길다.

// ... 중략 ...
MvcResult mvcResult = this.mockMvc.perform(get("/greet"))
      .andDo(print()).andExpect(status().isOk())
      .andExpect(jsonPath("$.message").value("Hello World!!!"))
      .andReturn();

Assert.assertEquals("application/json;charset=UTF-8", 
      mvcResult.getResponse().getContentType());

그리고 우리는 비동기 응답(Callable, DeferredResult 등)을 주는 형태의 컨트롤러의 테스트를 할때는 아래와 유사한 형태의 테스트 코드를 사용하게 된다.

// ... 중략 ...
MvcResult result = mockMvc.perform(get("/test/deferred").contentType(APPLICATION_JSON)).andReturn();

mockMvc.perform(asyncDispatch(result))
       .andExpect(status().isOk())
       .andExpect(header().string(CONTENT_TYPE, APPLICATION_JSON_VALUE))
       .andExpect(jsonPath("message").value("hello"));

아래는 위에서 언급한 문서에서 알려준 형태의 테스트 코드인데 @SpringBootTest 사용해서 컨트롤러에 구현된 Endpoint 테스트하는 코드이다. TestRestTemplate 이라는 클래스를 사용해서 기존 RestTemplate 클래스의 사용방식처럼 테스트를 할 수 있다.

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureWebTestClient
public class SimpleRestControllerTests {

  @Autowired
  private TestRestTemplate testRestTemplate;

  @Autowired
  private PersonRepository personRepository;

  @Test
  @DisplayName("간단한 컨트롤러 통합 테스트")
  public void shouldGetSomePersons() {
    Person saved = personRepository.save(new Person("kuk", 70));
    String response = testRestTemplate.getForObject("/people?name=kuk", String.class);
    assertThat(response).contains(saved.getAge().toString());
  }
}

샘플 github 프로젝트

'IT 기술' 카테고리의 다른 글

[shell] if문에서 문자열 비교가 안될때  (0) 2019.12.05
[Kubernetes] StatefulSet podAntiAffinity  (0) 2019.08.03
[swagger2] Whitelabel Error Page  (0) 2019.07.06
JPA Auditing  (0) 2019.06.23
[PostgreSQL] Postgresql DB 생성 on Mac  (0) 2019.04.27
Comments