Mockito
모의 객체 생성 프레임워크
mock: 모조품
mockito: 모조품을 쉽게 만드는 프레임워크
협력 객체에서 반환 값이 없는 경우, 즉 간접 입력이 없는 경우 협력 객체에서 변수를 잘 받았는지 그리고 잘 처리했는 지를 검증(간접 출력) → mockito
Mock
모의 객체 생성 및 모의 객체 동작 지정(Stubbing)
- 모의 객체가 제공하는 연산을 지닌 인터페이스 선언
- @Mock과 @InjectMocks 어노테이션을 사용하여 모의 객체 생성
- 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 |
댓글