지난 번에 Repository에 대한 단위테스트를 진행했으니 이번에는 Service레이어 대한 단위테스트를 진행해보고자 한다. 그런데 Service레이어는 Repository에 의존하다보니 단위테스트 진행이라고 부르기 어려워져 버렸다. 이럴 때 사용하는 대표적인 프레임워크가 Mockito Framework다.
먼저 Mockito를 Junit테스트에 추가해준다.
@ExtendWith(MockitoExtension.class)
public class ArticleServiceUnitTest{
}
@ExtendWith(MockitoExtension.class)
public class ArticleServiceUnitTest{
@InjectMocks private ArticleService articleService;
@Mock private ArticleRepository articleRepository;
}
@ExtendWith(MockitoExtension.class)
public class ArticleServiceUnitTest{
@InjectMocks private ArticleService articleService;
@Mock private ArticleRepository articleRepository;
@Test
@DisplayName("id로 게시글 찾기 테스트")
public void findByIdFailTest(){
Long id = 1L;
//만약 articeRepository.findById()가 호출되면 Optional.empty()를 반환하겠다는 의미
given(articleRepository.findById(id)).willReturn(Optional.empty());
//Assertj를 이용한 테스트 진행
Assertions.assertThatThrownBy(() -> articleService.getArticle(id))
.isInstanceOf(EntityNotFoundException.class);
}
}
@ExtendWith
를 이용해 Mockito사용을 명시적으로 선언해주어야 한다. 그리고 테스트 하고자 하는 클래스 객체에는 @InjectMock
그리고 해당 클래스가 의존하는 객체에는 @Mock
을 선언하여 Mockito의 가짜 객체 관련 메소드를 이용할 수 있게 해주면 된다.