이전

Mockito

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

Mockito

스프링 부트 2.2+ 프로젝트 생성시 spring-boot-starter-test에서 자동으로 Mockito 추가해 줌.

다음 세 가지만 알면 Mock을 활용한 테스트를 쉽게 작성할 수 있다.

  • Mock을 만드는 방법
  • Mock이 어떻게 동작해야 하는지 관리하는 방법
  • Mock의 행동을 검증하는 방법

Mock 객체 만들기

Mockito.mock() 메소드로 만드는 방법

MemberService memberService = mock(MemberService.class);
StudyRepository studyRepository = mock(StudyRepository.class)

@Mock 애노테이션으로 만드는 방법

  • JUnit 5 extension으로 MockitoExtension을 사용해야 한다.
  • 필드
  • 메소드 매개변수
@ExtendWith(MockitoExtension.class)
class StudyServiceTest {

    @Mock MemberService memberService;

    @Mock StudyRepository studyRepository;
@ExtendWith(MockitoExtension.class)
class StudyServiceTest {
    
    @Test
    void createStudyService(@Mock MemberService memberService,
                            @Mock StudyRepository studyRepository) {
        StudyService studyService = new StudyService(memberService, studyRepository);
        assertNotNull(studyService);
    }
}

Mock 객체 Stubbing

모든 Mock 객체의 행동

  • Null을 리턴한다. (Optional 타입은 Optional.empty 리턴)
  • Primitive 타입은 기본 Primitive 값.
  • 콜렉션은 비어있는 콜렉션.
  • Void 메소드는 예외를 던지지 않고 아무런 일도 발생하지 않는다.

Mock 객체를 조작해서

Mock 객체 확인

Mock 객체가 어떻게 사용이 됐는지 확인할 수 있다.

Mockito BDD 스타일 API

BDD: 애플리케이션이 어떻게 “행동”해야 하는지에 대한 공통된 이해를 구성하는 방법으로, TDD에서 창안했다.

행동에 대한 스팩

  • Title
  • Narrative
    • As a / I want / so that
  • Acceptance criteria
    • Given / When / Then

Mockito는 BddMockito라는 클래스를 통해 BDD 스타일의 API를 제공한다.

When -> Given

given(memberService.findById(1L)).willReturn(Optional.of(member));
given(studyRepository.save(study)).willReturn(study);

Verify -> Then

then(memberService).should(times(1)).notify(study);
then(memberService).shouldHaveNoMoreInteractions();