스프링 부트를 활용한다면
spring-boot-starter-test 에 이미 mockito의 의존성이 추가 되어있다.
그렇지 않다면 두가지 의존성을 직접 추가하자
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>3.1.0</version> <scope>test</scope> </dependency> <-- Mockito Jupiter - JUnit과 Mockito의 연동 (JUnit의 Extention임) --> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> <version>3.1.0</version> <scope>test</scope> </dependency>
Mock을 활용한 테스트를 작성하는법
- Mock을 만드는 방법
- Mock의 동작을 관리하는 방법
- Mock의 행동을 검증하는 방법
- Mock을 만드는 방법
MemberService memberService = Mockito.mock(MemberService.class); StudyRepository studyRepository = Mockito.(StudyRepository.class);
@Mock
어노테이션 활용
- 클래스에
@ExtendWith(MockitoExtension.class)
있어야함
@Mock MemberService memberService; @Mock StudyRepository studyRepository;
@Test void createStudyService(@Mock MemberService memberService, @Mock StudyRepository studyRepository) { ... }
- Mock Object Stubbing
기본적으로 모든 Mock 객체는
- null을 return
- Optional 타입은 Optional.empty
- primitive 타입은 기본 primitive 값
- collection은 빈 콜렉션
- void 를 리턴하는 메소드는 예외를 던지지 않고 아무것도 하지 않음
@Test void createNewStudy(@Mock MemberService memberService, @Mock StudyRepository studyRepository) { StudyService studyService = new StudyService(memberService, studyRepository); assertNotNull(studyService); Member member = new Member(); member.setId(1L); member.setEmail("keesun@email.com"); Mockito.when(memberService.findById(ArgumentMatchers.any())) .thenReturn(Optional.of(member)) .thenThrow(new RuntimeException()) .thenReturn(Optional.empty()); Optional<Member> byId = memberService.findById(1L); assertEquals("keesun@email.com", byId.get().getEmail()); assertThrows(RuntimeException.class, () -> { memberService.findById(2L); }); assertEquals(Optional.empty(), memberService.findById(3L)); }