현업에서 JUnit과 h2 DB를 이용한 테스트는 자주 사용해왔는데 Mockito를 써본 적이 없어서 이번 기회에 개인적으로 연습을 좀 해봤는데 써보니 확실히 느껴지는 차이가 있어서 공유하고자 해당 포스팅을 작성하였고 전체 소스는 Testcode Practice GitHub Repository를 참고부탁드립니다.
어려운 설명 다 빼고 그냥 아래 두 가지 내용이 이 라이브러리들을 관통하는 핵심 인 것 같습니다.
JUnit만 쓰는 경우 DB와 상호작용하여 테스트 해야한다.
JUnit과 Mockito를 같이 쓰면 DB와 상호작용 없이 테스트 할 수 있다.
공통점은 둘 다 테스트 데이터를 세팅해줘야하는데 이걸 DB에 세팅할지 코드로 세팅할지 정도의 차이점이 있습니다. 물론 까보면 세부적인 차이도 많지만 크게 느껴지는 것은 이정도 였습니다.
// JUnit에서 테스트 데이터 세팅 예시(JPA)
Users user = Users.builder()
.name("이동기")
.email("oksk4753@gmail.com")
.build();
usersRepository.save(user);
// Mockito를 이용했을때 테스트 데이터 세팅 예시
List<UsersResponseDto.UsersResponse> mockResponse = new ArrayList<>();
mockResponse.add(new UsersResponseDto.UsersResponse(1L, "이동기", "oksk4753@gmail.com"));
when(usersService.getUsersList(any(UsersRequestDto.GetUsersRequest.class))).thenReturn(mockResponse);
mockito만의 특징이라하면 특정 메서드 호출에 대한 응답 값 설정, 특정 메서드 호출에 대해 예외나 메세지를 던지도록 설정, 특정 메서드 호출 횟수 확인 등등을 확인 할 수 있는 여러가지 함수를 제공해줍니다.
공통적으로 경우 assert~ 라는 함수를 통해서 예상한 값 또는 검증과 일치하는 결과가 나왔는지 확인합니다.
'두개 섞어서 쓰면 너무 좋겠는데?' 라는 생각이 들었습니다. 굳이 DB를 갔다오지 않아도 똑같은 값 또는 비슷한 형식의 값이 나오는 로직이 종종 있는 경우가 있는데 이럴때 Mockito를 쓰면 좋겠다는 생각을 했습니다.