테스트 코드 작성

최준호·2022년 5월 14일
0

game

목록 보기
11/14
post-thumbnail

우선은 지난번 사용했던 google api 요청 webclient를 공통으로 처리할 수 있도록 변환하려고 한다.

😂기존 코드

@Service
@RequiredArgsConstructor
@Slf4j
public class GoogleServiceImpl implements GoogleService{

    //google places api
    //https://developers.google.com/maps/documentation/places/web-service/search-nearby
    @Override
    public ResponseEntity<String> places(RequestPlaces requestPlaces) {
        log.info("places 호출");
        WebClient googleClient = WebClient.builder().baseUrl("https://maps.googleapis.com")
                .build();

        //거리 기본값 500
        if(requestPlaces.getRadius() == 0) requestPlaces.setRadius(500);

        ResponseEntity<String> result = googleClient.get().uri(uriBuilder ->
            uriBuilder.path("/maps/api/place/nearbysearch/json")
                .queryParam("location", String.format("%s , %s",requestPlaces.getLat(), requestPlaces.getLng()))
                .queryParam("keyword", requestPlaces.getKeyword())
                .queryParam("radius", requestPlaces.getRadius())
                .queryParam("language", "ko")
                .queryParam("key", "AIzaSyDd4q1fnJ_2BBXJo8TgMA1-0Csgf_y6Ya8")
                .build()
        ).retrieve()
        .toEntity(String.class)
        .block();

        return result;
    }
}

🔨WebClient를 Bean으로 등록

@Component
public class GoogleWebClient {

    @Bean
    public WebClient getGoogleWebClient(){
        return WebClient.builder().baseUrl("https://maps.googleapis.com")
                .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .build();
    }
}

코드는 간단하다. GoogleWebClient class를 생성하고 Component로 등록하여 Spring에서 해당 class를 스캔하도록 한뒤 Bean으로 getGoogleWebClient를 등록하고 해당 메서드는 WebClient 객체를 반환하도록 해두었다.

@Service
@RequiredArgsConstructor
@Slf4j
public class GoogleServiceImpl implements GoogleService{

    private final GoogleWebClient googleWebClient;

    //google places api
    //https://developers.google.com/maps/documentation/places/web-service/search-nearby
    @Override
    public ResponseEntity<String> places(RequestPlaces requestPlaces) {
        log.info("places 호출");
//        WebClient googleClient = WebClient.builder().baseUrl("https://maps.googleapis.com")
//                .build();

        //거리 기본값 500
        if(requestPlaces.getRadius() == 0) requestPlaces.setRadius(500);

        ResponseEntity<String> result = googleWebClient.getGoogleWebClient().get().uri(uriBuilder ->
            uriBuilder.path("/maps/api/place/nearbysearch/json")
                .queryParam("location", String.format("%s , %s",requestPlaces.getLat(), requestPlaces.getLng()))
                .queryParam("keyword", requestPlaces.getKeyword())
                .queryParam("radius", requestPlaces.getRadius())
                .queryParam("language", "ko")
                .queryParam("key", "AIzaSyDd4q1fnJ_2BBXJo8TgMA1-0Csgf_y6Ya8")
                .build()
        ).retrieve()
        .toEntity(String.class)
        .block();

        return result;
    }
}

코드를 수정한 뒤 다시 서버를 재부팅하여 제대로 잘 동작하는지 확인해보자.

기능은 정상적으로 잘 작동하는 걸 확인할 수 있다.

👏Test Code 작성

실제로 잘 작동하는 것 보다 원래 Test Code가 먼저지만... 이제 Test Code를 작성해보자.

@SpringBootTest
class GoogleServiceImplTest {

    @Autowired
    public GoogleWebClient googleWebClient;

    @Autowired
    private GoogleServiceImpl googleService;


    @Test
    void plcaes_api_호출(){
        //given
        RequestPlaces requestPlaces = RequestPlaces.builder()
                .lat("37.4472704")
                .lng("127.156224")
                .keyword("중국집")
                .radius(500)
                .build();
        ResponseEntity<String> result = googleWebClient.getGoogleWebClient().get().uri(uriBuilder ->
                uriBuilder.path("/maps/api/place/nearbysearch/json")
                        .queryParam("location", String.format("%s , %s",requestPlaces.getLat(), requestPlaces.getLng()))
                        .queryParam("keyword", requestPlaces.getKeyword())
                        .queryParam("radius", requestPlaces.getRadius())
                        .queryParam("language", "ko")
                        .queryParam("key", "AIzaSyDd4q1fnJ_2BBXJo8TgMA1-0Csgf_y6Ya8")
                        .build()
        ).retrieve()
        .toEntity(String.class)
        .block();

        //when
        ResponseEntity<String> places = googleService.places(requestPlaces);
        //then
        Assertions.assertThat(result.getStatusCode()).isEqualTo(places.getStatusCode());
    }
}

원래는 Mockito를 사용하여 단위 테스트로 진행하려고 했는데... WebClient가 Mock으로 테스트할 경우 NPE(Null Pointer Exception)이 발생하더라...ㅜㅜ 그래서 내용을 찾아보니 Mockito로 Webclient 테스트하기라는 글을 보게 되었고 해당 방법으로 진행하면 되긴 하지만 api를 Mock 데이터로 호출하기 때문에 내부 로직만 잘 작동하는지 확인이 가능하다. 하지만 내 메서드의 경우 api 호출이 끝이기 때문에 정말 정상적으로 api 결과값이 오는지가 중요했고 그렇기 때문에 그냥 통합 테스트로 진행했다.

결과는 정상 성공으로 나온다.

body의 결과를 비교하고 싶었지만 google에서 보내는 데이터의 내용이 조금씩 달라 정상 실행값인 statusCode를 통해 비교했다.

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글