트러블 슈팅 : Spring Boot 테스트: @RequestParam의 기본값과 Mockito any() 메서드 사용 시 주의점

song yuheon·2023년 10월 23일
0

Trouble Shooting

목록 보기
41/57
post-thumbnail
post-custom-banner

문제


Spring Boot에서 Controller 계층의 메서드를 테스트하던 중 NullPointerException이 발생했다.
@RequestParam을 사용하여 요청 파라미터를 받아오는 과정에서 파라미터의 기본값이 null로 설정되어 있었고, 이로 인해 테스트 중에 null 값이 메서드로 전달되었다.
Mockito를 사용하여 서비스 계층의 메서드를 모의(Mock)할 때 any(클래스.class) 형태로 작성하였지만, 실제로는 null 값이 전달되어 문제가 발생했다.


문제 분석


@RequestParam의 기본값이 null로 설정되어 있고, Mockito를 사용하여 서비스 계층의 메서드를 모의할 때 any(클래스)를 사용했기 때문에, null 값을 받아들일 수 없었다.


해결

디버거를 사용하여 실제로 어떤 값이 메서드로 전달되는지 확인했다.
이 과정에서 null 값이 전달되는 것을 확인하고, Mockito의 when 구문에서 사용하는 any() 메서드를 any(클래스)에서 any()로 변경하여 문제를 해결할 수 있었다.
any() 메서드는 어떤 타입이나 값이든 받아들일 수 있기 때문에, null 값도 문제없이 처리할 수 있다.


    @Test
    void bookDonationEventOnlyV3() throws Exception {
        //given
        // when
        when(bookDonationEventService.getDonationEventOnlyV3(any(PageRequest.class),any(Long.class),any(LocalDate.class),any(LocalDate.class)))
                .thenReturn(BookDonationEventOnlyPageResponseDto.builder().bookDonationEventOnlyResponseDtos(new ArrayList<>()).build());

        when(bookDonationEventService.getDonationEventOnlyV3(any(),any(),any(),any()))
                .thenReturn(BookDonationEventOnlyPageResponseDto.builder().bookDonationEventOnlyResponseDtos(new ArrayList<>()).build());
        //then
        mockMvc.perform(get("/users/bookDonationEvent/v3"))
                .andExpect(status().isOk())
                .andExpect(view().name("/users/bookDonationEventV2"));
    }

profile
backend_Devloper
post-custom-banner

0개의 댓글