본문 바로가기
Java

Mockito

by 모스키토끼 2020. 11. 16.

Mockito

모의 객체 생성 프레임워크

mock: 모조품

mockito: 모조품을 쉽게 만드는 프레임워크

협력 객체에서 반환 값이 없는 경우, 즉 간접 입력이 없는 경우 협력 객체에서 변수를 잘 받았는지 그리고 잘 처리했는 지를 검증(간접 출력) → mockito

Mock

모의 객체 생성 및 모의 객체 동작 지정(Stubbing)

  1. 모의 객체가 제공하는 연산을 지닌 인터페이스 선언
  2. @Mock과 @InjectMocks 어노테이션을 사용하여 모의 객체 생성
  3. Mockito의 when().thenReturn()을 사용하여 동작 지정

예시)

→ pm은 다른 동작은 못하고 1234가 들어왔을 때 1000을 리턴해주는 모의 객체가 되었다.

→ cart입장에서는 간접입력을 생성한 것

✔️ doReturn().when()

동일한 메서드를 다른 인자로 여러 번 호출할 때 사용(Stubbing을 두 개 이상 만들고 싶은 경우)

예시)

Loose stubbing vs Strict stubbing

Loose stubbing: 주피터 이전 버전 stubbing의 디폴트 값

Strict stubbing: 주피터 버전 stubbing의 디폴트 값

차이점

  • Lenient를 사용하면 loose이고 사용하지 않으면 Strict
  • 불필요한 stubbing을 어떻게 처리하는지 차이(loose는 넘긴다, strict는 에러를 띄운다)

loose 예시

  • Mockito.lenient(). when(pm.getPrice("1234")). thenReturn(1000)

✔️ when(). thenAnswer()

모의 객체를 Stubbing 할 때 특정 값으로 반환하는 대신 메서드 인자 값에 따라 반환 값을 결정할 때 사용(하나의 when으로 여러 리턴 값 설정)

예시)

간접 출력 테스트

테스트 대상 클래스에서 기능이 반환 값이 없는 경우

  • 상태 기반 테스트가 아닌 Interaction based test를 수행
  • 기능의 로직이 올바르게 구현되었는지를 테스트
  • 이를 위해 간접 출력이 올바르게 이루어졌는가를 테스트(호출 횟수 및 인자의 전달)

예제)

→ doIt메서드가 "Hello" 문자열을 받은 경우에 협력 객체인 Doc 객체의 연산 say("World!", 1)를 호출하는지를 테스트하고 싶은 경우

→ doIt메서드가 "Hello" 문자열을 받지 않은 경우 Doc 객체의 say("Hi!", 2)를 호출하는지 테스트 하고 싶은 경우

이때, verify()와 ArgumentCaptor를 사용하여 테스트한다.

✔️ Verify()

호출이 원하는 횟수만큼 이루어졌는지 테스트

  • verify(모의 객체). 모의 객체의 메서드
  • verify(모의 객체, 호출 횟수 지정 메서드).모의 객체의 메소드

호출 횟수 메서드

메서드 설명
times(n) times(n) N번 호출되었는지 확인
never() never() 호출되지 않아야 함
atLeastOnce() atLeastOnce() 최소한 한 번 호출되어야 함
atLeastOnce(n) atLeastOnce(n) 최소한 n 번 호출되어야 함
atMostOnce(n) atMostOnce(n) 최대 n 번까지 호출 될 수 있음

✔️ ArgumentCaptor

연산 호출할 때 인자 전달이 제대로 이루어졌는지를 테스트

예시)

※ 본 글은 정인상 교수님의 테스트 강의자료를 기반으로 작성했습니다.

'Java' 카테고리의 다른 글

함수형 인터페이스 활용  (0) 2020.11.16
Junit5  (0) 2020.11.16
함수형 인터페이스 모음  (0) 2020.10.08

댓글