Mockito 란?

Bong2·2022년 4월 2일
0

Mockito

Mock : 진짜 객체와 비슷하게 동작하지만 프로그래머가 직접 그 객체의 행동을 관리하는 객체
-> 단위 테스트를 진행할 때 실제 객체를 만들어서 사용하게 되면 의존성이 높아져 복잡해진다. 이문제를 해결하기 위해 사용

Mockito : Mock 객체를 쉽게 만들고 관리하고 검증할 수 있는 방법을 제공
단위 테스트를 위한 Java mocking framework입니다.

스프링 부트 : spring boot start test에서 자동으로 Mockito 추가해줌

Mock 객체 만들기

1.Mockito.mock() 메서드

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

2. @Mock

  • extension으로 MockitoExtension 사용
  • 필드
  • 메서드 매개변수
@ExtendWith(MockitoExtension.class)
class StudyServiceTest {
//필드
    @Mock MemberService memberService;

    @Mock StudyRepository studyRepository;

//매개 변수
 @Test
    void createStudyService(@Mock MemberService memberService,
                            @Mock StudyRepository studyRepository) {
        StudyService studyService = new StudyService(memberService, studyRepository);
        assertNotNull(studyService);
    }

Stubbing

모든 Mock 객체의 행동을 정의하는 것

  • Null 리턴(Optional타입은 Optional.empty)
  • Primitive 타입은 기본 Primitive
  • 콜렉션은 비어있는 콜렉션
  • void 메소드는 예외를 던지지 않고 아무런 일 발생X
1.
//mock 객체의 행동을 조작
//findById를 할때 memeber 클래스를 return 
when(memberService.findById(1L)).thenReturn(member);
when(memberService.findById(any()).thenReturn(member);//어떠한 형태가 들어오든 
  1. 특정한 매개변수를 받은 경우 특정한 값을 리턴하거나 예외를 던지도록 만들 수 있다.
2.
when(memberService.findById(1L)).thenThrow(new RuntimeException());
  1. Void 메소드 특정 매개변수를 받거나 호출된 경우 예외를 발생 시킬 수 있다.
when(memberService.findById(1L)).thenReturn(member)
						.thenThrow(new RuntimeException())
                        .thenReturn(null);
  1. 메소드가 동일한 매개변수로 여러번 호출될 때 각기 다르게 행동호도록 조작할 수도 있다.

Mock 객체 검증

Mock 객체가 어떻게 사용이 됐는지 검증

  • 특정 메서드가 특정 매개변수로 몇번 호출되었는지
    • times(n): n번 호출했음
    • never(): 한 번도 호출하지 않음
    • atMostOnce(): 최대 한번 호출
    • atLeastOnce(): 최소 한번 호출
    • atLeast(n): 최소 n번 호출
    • atMost(n): 최대 n번 호출
  • 어떤 순서대로 호출했는지
    - InOrder를 통해 InOrder 객체 생성
  • 특정 시간 이내에 호출 됐는지
  • 특정 시점 이후에 아무 일도 벌어지지 않았는지
//notify라는 메서드가 한번이라도 호출되어야된다.
verify(memberService,times(1)).notify(any());
verify(memberService,never()).notify(any());

InOrder inOrder = inOrder(memberService);
inOrder.verify(memberService).notify(any());

BDD Mockito 스타일 API

BDD : 애플리케이션이 어떻게 "행동"해야 하는지에 대한 공통된 이해를 구성하는 방법으로 TDD에서 창안했다.
Given 영역에 when이라는 이름이 어울리지 않아 새로 만들었다고 한다. BDDMockito는 Mockito를 상속하기 때문에 기능은 같다.

  • 행동에 대한 스펙
    1. Given
    1. When
    2. 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();
profile
자바 백엔드 개발자로 성장하자

0개의 댓글