관리 메뉴

너와 나의 스토리

[SpringBoot] RestTemplate Test Code - Exception handling 테스트 본문

개발/Spring Boot

[SpringBoot] RestTemplate Test Code - Exception handling 테스트

노는게제일좋아! 2022. 6. 2. 13:05
반응형

RestTemplate Exception Handling 방법

 

통신 및 error handling 코드

  • RestTemplate으로 통신 및 Error handling
@RequiredArgsConstructor
public class RestApi {

    private final RestTemplate restTemplate;

    public User getUser() {
        restTemplate.setErrorHandler(new RestTemplateResponseErrorHandler());
        try {
            ResponseEntity<User> response = restTemplate.exchange(
                    "https://server-url-to-send-user-info",
                    HttpMethod.GET,
                    null,
                    User.class
            );
            return Objects.requireNonNull(response.getBody());
        } catch (HttpClientErrorException e) {
            if (e.getStatusCode() == HttpStatus.PRECONDITION_FAILED) {
                throw new CustomException1("조회할 수 없는 사용자입니다.");
            } else if (e.getStatusCode() == HttpStatus.NOT_IMPLEMENTED) {
                throw new CustomException2("아직 구현되어 있지 않습니다.");
            }
            throw e;
        }
    }
}

public class User {
    public String name;
    public Integer age;

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}

 

 

Test Code

  • RestTemplate을 mocking
    • RestApi에서 RestTemplate을 생성자 주입해야지 mocking한 RestTemplate을 사용할 수 있다.
  • Exception Handling 테스트
@Test
void shouldThrowCustomException1() {
    // Given
    String url = "https://server-url-to-send-user-info";

    // When
    when(restTemplate.exchange(url, HttpMethod.GET, null, User.class))
            .thenThrow(new HttpClientErrorException(HttpStatus.NOT_IMPLEMENTED));

    // Then
    assertThrows(CustomException2.class, () -> sut.getUser());
}
  • 정상적으로 데이터를 받는지 테스트
@Test
void shouldGetUser() {
    // Given
    String url = "https://server-url-to-send-user-info";
    User user = new User("name", 0);

    // When
    when(restTemplate.exchange(url, HttpMethod.GET, null, User.class))
            .thenReturn(new ResponseEntity<>(user, HttpStatus.OK));
    User response = sut.getUser();

    // Then
    assertEquals("name", response.name);
    assertEquals(0, response.age);
}

 

반응형
Comments