mockito는 실제 객체와 비슷하게 동작하도록 하여 검증할 수 있는 방법을 제공해주는 라이브러리 이다.
spring-boot-starter-test 모듈에 기본적으로 포함되어 있으며, 이 모듈을 사용하지 않을 경우 mockito-core, mockito-junit-jupiter 모듈을 추가하면 된다.
Mock 객체 만들기
Mock 객체를 만들어서 테스트를 진행할 수 있다. Mock객체로 만들고 싶은 객체에 @Mock 어노테이션을 달기만 하면 되는데 이때 만들어진 Mock 객체는 Null이기 때문에 그렇게 하지 않기 위해서 @ExtendWith(MockitoExtension.class)를 추가한다.
@ExtendWith(MockitoExtension.class)
class MockWedulTest {
@Mock
WedulRepository wedulRepository;
WedulService wedulService;
@BeforeEach
void setup() {
this.wedulService = new WedulService(wedulRepository);
}
@Test
@DisplayName("Mock test")
void mock_test() {
}
}
모든 Mock 객체의 반환 타입은 다음과 같다.
- 객체는 Null
- Option 타입은 Optional.empty 리턴
- Primitive 타입은 기본 Primitive 값
- 콜렉션은 비워있는 콜렉션
- void 반환값의 메소드는 아무런 일이 발생되지 않는다.
Stubbing
Mock 객체에 원하는 동작을 미리 지정해주는 것을 stub라고 하는데 이를 한번 수행해보자.
여러가지 stub 있겠지만 대표적으로 when을 많이 사용한다.
@Test
@DisplayName("Mock test")
void mock_test() {
Wedul wedul = new Wedul();
when(wedulRepository.getWedul(anyLong())).thenReturn(wedul);
assertThat(wedulService.getWedul(1L)).isEqualTo(wedul);
}
Stubbing 확인
Mock 객체의 특정 행위가 몇번 호출되었는지, 추가적으로 interaction이 발생되었는지 여부등도 확인이 가능하다.
@Test
@DisplayName("stubbing verify 테스트")
void verify_stub_test() {
Wedul wedul = new Wedul();
when(wedulRepository.getWedul(anyLong())).thenReturn(wedul);
assertThat(wedulRepository.getWedul(1L)).isEqualTo(wedul);
// 목 객체의 getWedul()이 한번 실행되었는지 검증
verify(wedulRepository, times(1)).getWedul(1L);
// 목 객체 validate()가 한번도 안 실행되었는지 검증
verify(wedulRepository, never()).validate();
// 해당 Mock이 더 이상 interactiondl 발생되지 않아야 한다.
verifyNoMoreInteractions(wedulRepository);
}
BDD Mockito
BDD(Behaviour-Driven Development)는 행동 기반 테스트인데 Mockito에서 제공하는 기능들을 이용하면 Given / When / Then 순서대로 검증이 가능하다.
- when이라는 subbing 메서드와 동일한 역할을 하는 given은 BDD를 위해서 when 대신 Given으로 사용한다.
- then을 통해서 검증이 가능하다.
@Test
@DisplayName("BDD 테스트")
void bdd() {
// given
Wedul wedul = new Wedul();
given(wedulRepository.getWedul(1L)).willReturn(wedul);
// when
Wedul selectWedul = wedulService.getWedul(1L);
// then
assertThat(selectWedul).isEqualTo(wedul);
then(wedulRepository).should(times(1)).getWedul(1L);
then(wedulRepository).shouldHaveNoMoreInteractions();
}
출처 : https://www.inflearn.com/course/the-java-application-test/
Github : https://github.com/weduls/junit5
'web > Junit' 카테고리의 다른 글
Junit5 Test Container사용하여 테스트 환경 구축하기 (인프런 백기선님 강의 정리) (0) | 2019.12.26 |
---|---|
Spring BootJunit5 테스트 (백기선님 인프런 강의) (0) | 2019.12.23 |
Junit 정리 - 서비스 테스트 하기 (1) | 2018.05.27 |
Junit 정리 - MockMvc를 이용한 컨트롤러 테스트 (6) | 2018.05.27 |