Java 테스트 코드 트러블 슈팅 java.lang.NullPointerException 원인 및 해

song yuheon·2023년 10월 12일
0

Trouble Shooting

목록 보기
27/57


문제상황


예상과 달리 IllegalArgumentException이 아닌 java.lang.NullPointerException 오류가 발생하였다.


문제 분석


adminDonationEventRepository.findById(any(Long.class)) 메소드는 Optional를 반환한다.

실제 코드에서 orElseThrow를 사용하여 Optional 값이 null일 경우 IllegalArgumentException을 발생시키려고 했지만 하지만 테스트 코드에서는 다음과 같이 null 값을 반환하도록 모킹하여서 문제가 발생하였다.


문제 코드


Code

    @Transactional
    public ResponseEntity<MessageDto> updateDonationEvent(Long donationId, BookDonationEventRequestDto bookDonationEventRequestDto) {
        BookDonationEvent bookDonationEvent = adminDonationEventRepository.findById(donationId).orElseThrow(
                () -> new IllegalArgumentException("해당 이벤트가 존재하지 않습니다.")
        );
        bookDonationEvent.update(bookDonationEventRequestDto);
        return ResponseEntity.ok(new MessageDto("이벤트 수정이 완료되었습니다"));
    }

TestCode

    @Test
    void updateDonationEvent_Event_is_Null() {
        // given

        when(adminDonationEventRepository.findById(any(Long.class))).thenReturn(null);

        // when
        // then
        assertThrows(IllegalArgumentException.class,
                () -> adminDonationEventService.updateDonationEvent(1L,new BookDonationEventRequestDto()));
    }

해결 방안


위의 모킹 구문을 Optional.empty()를 반환하도록 수정한다.

when(adminDonationEventRepository.findById(any(Long.class))).thenReturn(Optional.empty());
  


profile
backend_Devloper

0개의 댓글