반응형
Pageable 테스트를 진행하던중 에러가 발생했다.
1. 에러가 발생한 코드 확인
when(boardService.selectAllBoardList(pageable)).thenReturn(boardDtoPage);
- 에러 메시지는 NullPointerException이었다.
- 이건 when(boardService.selectAllBoardList(pageable)).thenReturn(boardDtoPage); 부분에서 모의 객체의 동작을 설정할 때 문제가 발생한 것이다.
- 모의 객체의 동작을 when()또는 given()으로 설정할 때, 메서드 호출에 사용되는 인자가 정확히 일치해야 한다. Pageable 인스턴스는 동일한 페이지 번호와 페이지 크기를 가지더라도 다른 인스턴스일 수 있으므로, 이로 인해 문제가 발생할 수 있다.
- 무슨 말이냐 하면 "Mockito"에서 모의 객체의 동작을 설정할 때, 메서드 호출에 사용되는 인자가 모의 객체에서 기대하는 인자와 정확히 일치해야 한다. pageable 객체의 경우, 실제로 전달된 인스턴스와 모의 객체에서 예상하는 인스턴스가 서로 다를 수 있다.
- 즉, 두 객체는 같은 값을 가지고 있더라도 서로 다른 주소를 가질 수 있기 때문에 Java의 equals로 비교했을 때 같지 않다고 판단될 수 있다. 이러한 문제를 해결하기 위해 any()를 사용하여 특정 클래스의 어떠한 인스턴스라도 허용하는 방식으로 모의 객체를 설정할 수 있다.
2. 코드 수정
when(boardService.selectAllBoardList(any(Pageable.class))).thenReturn(boardDtoPage);
- any(Pageable.class)를 사용하여 boardService.selectAllBoardList 메서드가 어떤 Pageable 인스턴스와 함께 호출되더라도 boardDtoPage를 반환하도록 설정하였다.
테스트 코드를 작성하다보면 이런 문제에 많이 직면했다. 내가 mockito에 대해서 제대로 알지 못하고 테스트 코드를 작성하다보니 mock객체나 실제 객체를 사용한 테스트 설계에 미숙한것 같다. 조금 더 진정성 있게 테스트 코드에 대해서 공부해보자는 생각이 들었다.
2023.08.09 - [Spring 테스트코드/기초 지식] - [스프링, 스프링 부트] Spring test - 테스트 코드의 기초(1) [용어설명]
반응형
'Spring 테스트 코드' 카테고리의 다른 글
[Spring] 통합 테스트와 단위 테스트 비교하기 (58) | 2023.12.23 |
---|---|
주니어 개발자의 테스트 코드 이해하기 (2) | 2023.12.22 |
[스프링, 스프링부트] Spring test - 스프링 시큐리티의 authentication객체를 어떻게 사용해야 할까? (0) | 2023.08.22 |
Spring 서비스 테스트 중 발견한 NPE 해결기 (0) | 2023.08.17 |
[스프링, 스프링 부트] Spring test - service 테스트에서 만난 오류 (0) | 2023.08.16 |