Mock(진짜 객체 처럼 동작하지만 프로그래머가 직접 컨트롤 할 수 있는 객체)을 지원하는 프레임워크. Mock 객체를 만들고 관리하고 검증 할 수 있는 방법 제공.(가짜 객체를 만들어준다고 생각)
구현체가 아직 없는 경우나, 구현체가 있더라도 특정 단위만 테스트 하고 싶을 경우 주로 사용한다.
testCompile group: 'org.mockito', name: 'mockito-core', version: '3.7.7'
testCompile group: 'org.mockito', name: 'mockito-junit-jupiter', version: '3.7.7'
class StudyServiceTest {
@Test
void test() {
MemberService memberService = Mockito.mock(MemberService.class);
StudyRepository studyRepository = Mockito.mock(StudyRepository.class);
StudyService studyService = new StudyService(memberService, studyRepository);
}
}
클래스에 @ExtendWith(MockitoExtension.class)를 붙여주고 멤버변수에 @Mock을 붙여주기
@ExtendWith(MockitoExtension.class)
class StudyServiceTest {
@Mock
MemberService memberService;
@Mock
StudyRepository studyRepository;
@Test
void test() {
StudyService studyService = new StudyService(memberService, studyRepository);
}
}
파라미터로 넘길 수도 있다.
@ExtendWith(MockitoExtension.class)
class StudyServiceTest {
@Test
void test(@Mock MemberService memberService, @Mock StudyRepository studyRepository) {
StudyService studyService = new StudyService(memberService, studyRepository);
}
}
기본적으로 Mock객체는
Mock 객체를 만들었으면 테스트 할 행동이 어떻게 진행될 것인지에 대해 가정이 필요하다. 이때 Mock객체의 행동을 조작하는 것을 Stubbing 이라고 한다.
// 예제
Mockito.when(memberService.findById(1L)).thenReturn(Optional.of(member)); // findById 메소드에 1L 값을 넘기면 Optional.of(member) 객체를 리턴하도록 stubbing 한 것.
// == given(memberService.findById(1L)).willReturn(Optional.of(member));
특정 값 대신 Argument matchers를 통해 어느 값을 주든지 동작하도록 할 수 있다.
// 예제
Mockito.when(memberService.findById(Mockito.any())).thenReturn(Optional.of(member));
Mock객체를 조작한 이후 어떤일이 일어났는지 verify()
를 통해 확인해 볼 수 있다.
// 예제
Mockito.verify(memberService, Mockito.times(1)).notify(study); // memberService Mock 객체가 1번 study라는 매개변수를 가지고 notify 메소드 실행했는지 확인. 일어나지 않은 경우 에러 던짐
// == then(memberService).should(Mockito.times(1)).notify(study);
Mockito.verify(memberService, Mockito.never()).notify(Mockito.any()); // memberService Mock 객체가 어떤 매개변수든 간에 notify 메소드를 한 번도 실행하지 않았는지 확인.