SPRING

[SPRING] MOCKITO

집한구석 2022. 7. 3. 22:24
728x90

Mockito

  • Mock : 진짜 객체와 비슷하게 동작하지만 프로그래머가 직접 그 객체의 행동을 관리하는 객체
  • Mockito : Mock 객체를 쉽게 만들고면서 관리하고 검증하는 방법을 제공하는 것

Mock 활용하여 테스트 작성시 방법

  • Mock을 만드는 방법
  • Mock을 조작하는 방법
  • Mock을 확인하는 방법

Mock을 만드는 방법

@ExtendWith(MockitoExtension.class)
class UserServiceTest {
	
    @Mock
    UserService userService;
	
    @Mock
    userRepository userRepository;
	
    @Test
    void createStudyService() {
        UserService userService = new userService(userRepository);
        assertNotNull(studyService);
    }
}
  • 방법은 여러가지가 있으나 보편적으로는 Mock 애노테이션을 사용해서 만듬
  • @ExtendWith에서 MockitoExtension.class를 사용해야 Junit5와 Mockito가 연동이 됨

Mock을 조작하는 방법

모든 Mock 객체의 행동

  • null을 반환함 (Optional인 경우는 Optional.empty로 반환)
  • 기본 타입의 값
  • 콜렉션은 비어있는 콜렉션
  • void 메소드는 예외를 던지지 않고 아무일도 발생 안함

Stubbing

@Mock UserService userService;

User user = new User();
user.setId(1L);
user.setEmail("abc@abc.com");

//Mock객체를 Stubbing
when(userService.findById(1L)).thenReturn(Optional.of(user));
  • Mock 객체의 행동을 조작하는 것, 즉 모의 객체 생성 및 모의 객체 동작을 지정하는 과정
  • Mock 객체의 when 메소드를 활용하여 stubbing을 함
  • stubbing하였으면 어떤 결과를 반환하라고 정해진 답변을 준비해야함, thenReturn으로 예상되는 반환 정의함 (그외 다른 반환 방법으로는 doThrow 등이 있음)

Argument Matchers

when(userService.findById(any())).thenReturn(Optional.of(user));
 

ArgumentMatchers - mockito-core 4.6.1 javadoc

Latest version of org.mockito:mockito-core https://javadoc.io/doc/org.mockito/mockito-core Current version 4.6.1 https://javadoc.io/doc/org.mockito/mockito-core/4.6.1 package-list path (used for javadoc generation -link option) https://javadoc.io/doc/org.m

javadoc.io


Mock을 확인하는 방법

verify(userService, times(1)).notify(study)
  • verify : 메소드를 사용하는지 확인
  • notify : 특정 메소드가 몇번 호출되었는지 확인
  • mock 객체 userService의 notify가 한번 호출되어야함 

Mockito 어노테이션 요약

어노테이션 요약
Mock 실제 인스턴스 없이 가상의 mock 인스턴스를 직접 만들어서 사용
Spy 실제 인스턴스를 사용해서 mocking하여 사용, 행위를 지정하지 않으면 객체를 만들 경우 실제 인스턴스의 메소드를 호출함
InjectMock Mock이나 Spy 객체를 자신의 멤버클래스와 일치하는 경우 자동으로 주입함

추가 확인 정보는 https://github.com/mockito/mockito/wiki/Mockito-features-in-Korean 참고