트러블 슈팅: `BookServiceTest`에서 `NullPointerException` 발생 문제

song yuheon·2023년 10월 21일
0

Trouble Shooting

목록 보기
38/57
post-custom-banner

문제 상황



bookService 객체가 초기화되지 않아 해당 객체의 메서드를 호출할 때 NullPointerException이 발생하였다.


문제 원인


  • 오류를 읽어보니 BookService 객체가 초기화되지 않아 null 상태여서 문제가 발생한 것을 추정된다.

해결


@InjectMocks 어노테이션 사용
BookService 객체에 대해 @InjectMocks 어노테이션을 사용하여 인스턴스를 자동으로 생성하고 의존성을 주입합니다.

수정된 코드

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class BookServiceTest {

    @InjectMocks
    private BookService bookService;
    @Mock
    private BookRepository bookRepository;

    @BeforeAll
    void setUp() {
        MockitoAnnotations.openMocks(this);
    }

    @Test
    void findBookByNameAndRoleAndDonationIdWithPagination() {
        // given
        BooleanBuilder builder = new BooleanBuilder();
        Book book = Book.builder()
                .bookName("bookName")
                .bookAuthor("bookAuthor")
                .bookPublish("bookPublish")
                .bookStatus(BookStatusEnum.valueOf("POSSIBLE"))
                .build();
        List<Book> books = new ArrayList<>();
        books.add(book);

        when(bookRepository.findAll(any(BooleanBuilder.class), any(Pageable.class))).thenReturn(new PageImpl<>(books));

        // when
        Page<Book> result = bookService.findBookByNameAndRoleAndDonationIdWithPagination("bookName", "bookAuthor", "bookPublish", "POSSIBLE", 1L, Pageable.unpaged());

        // then
        assert(result.getTotalElements() == 1);
        assertThat(result.getContent().get(0).getBookName()).isEqualTo("bookName");
        assertThat(result.getContent().get(0).getBookAuthor()).isEqualTo("bookAuthor");
        assertThat(result.getContent().get(0).getBookPublish()).isEqualTo("bookPublish");
        assertThat(result.getContent().get(0).getBookStatus()).isEqualTo(BookStatusEnum.valueOf("POSSIBLE"));

    }
}

정리


단위테스트를 진행 할 때에 BookService 객체가 올바르게 초기화해야 한다.
만약 초기화 하지 않고 진행한다면 NullPointerException이 발생 할 수 있다.

@InjectMocks을 이용한다면 초기화를 하면서 동시에 테스트 코드의 가독성과 유지 보수성을 향상시킬 수 있을 것으로 추정된다.


profile
backend_Devloper
post-custom-banner

0개의 댓글