[Mockito] Mockito란?

Junseo Kim·2021년 1월 28일
0

Mockito란?

Mock(진짜 객체 처럼 동작하지만 프로그래머가 직접 컨트롤 할 수 있는 객체)을 지원하는 프레임워크. Mock 객체를 만들고 관리하고 검증 할 수 있는 방법 제공.(가짜 객체를 만들어준다고 생각)

구현체가 아직 없는 경우나, 구현체가 있더라도 특정 단위만 테스트 하고 싶을 경우 주로 사용한다.

Mockito gradle 의존성

    testCompile group: 'org.mockito', name: 'mockito-core', version: '3.7.7'
    testCompile group: 'org.mockito', name: 'mockito-junit-jupiter', version: '3.7.7'

Mock 객체 만들기

Mockito.mock(만들고자 하는 객체 타입.class)

class StudyServiceTest {
    
    @Test
    void test() {
        MemberService memberService = Mockito.mock(MemberService.class);
    	StudyRepository studyRepository = Mockito.mock(StudyRepository.class);
        
        StudyService studyService = new StudyService(memberService, studyRepository);
    }
}

@Mock

클래스에 @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객체는

  • void 메소드는 아무런 일도 발생하지 않는다.
  • return 값이 있는 메소드는 null을 리턴한다.(단 Optional 타입인 경우 비어있는 값으로 나온다)
  • Primitive 타입의 변수가 있는 경우 기본 값을 따른다.
  • 콜렉션은 비어있는 콜렉션으로 만들어준다.

Mock 객체를 만들었으면 테스트 할 행동이 어떻게 진행될 것인지에 대해 가정이 필요하다. 이때 Mock객체의 행동을 조작하는 것을 Stubbing 이라고 한다.

  • 특정한 매개변수를 받았을 때, 특정한 값을 리턴하거나 예외를 던지도록 설정할 수 있다.
  • void 메소드 호출시 예외를 던질 수 있다.
  • 동일한 메소드가 여러번 호출될 때, 각각 다르게 행동하도록 할 수 있다.(.thenReturn()이나 .thenThrow()를 이어 붙여서 사용)
// 예제

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 객체 검증

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 메소드를 한 번도 실행하지 않았는지 확인.

0개의 댓글