Spring Service 단위테스트 코드 작성

선종우·2023년 5월 11일
0

1. 공부배경

  • Spring MVC Repository 테스트코드 작성에 이어지는 글입니다.

2. 공부내용

  • 지난 번에 Repository에 대한 단위테스트를 진행했으니 이번에는 Service레이어 대한 단위테스트를 진행해보고자 한다. 그런데 Service레이어는 Repository에 의존하다보니 단위테스트 진행이라고 부르기 어려워져 버렸다. 이럴 때 사용하는 대표적인 프레임워크가 Mockito Framework다.

  • 먼저 Mockito를 Junit테스트에 추가해준다.

@ExtendWith(MockitoExtension.class)
public class ArticleServiceUnitTest{
}
  • 그 다음에는 가짜 객체 역할을 할(이 경우 Repository) 객체에 @Mock을 붙여준다. 이후 Service객체에 @InjectMock을 선언하여 가짜 Repository객체를 주입해 준다.
@ExtendWith(MockitoExtension.class)
public class ArticleServiceUnitTest{
    @InjectMocks private ArticleService articleService;
    @Mock private ArticleRepository articleRepository;
}
  • 이제 준비는 완료되었고, Mockito가 제공하는 기능을 이용해 articleRepository의 실제 행위에는 영향을 받지 않으며 Service에 대한 테스트가 가능해졌다.
  • 아래는 BDD스타일 테스트 예제이다.
@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);
    }
}

3. 정리

  • 의존관계가 있는 클래스에 대한 단위테스트를 진행하고 싶다면 Mockito Framework를 사용한다.
  • 해당 테스트 클래스는 @ExtendWith를 이용해 Mockito사용을 명시적으로 선언해주어야 한다. 그리고 테스트 하고자 하는 클래스 객체에는 @InjectMock 그리고 해당 클래스가 의존하는 객체에는 @Mock을 선언하여 Mockito의 가짜 객체 관련 메소드를 이용할 수 있게 해주면 된다.

0개의 댓글