선생님, 개발을 잘하고 싶어요.

[테스트] Mock, Mockito - 사용법, 레시피, when, verify, 유용한 코틀린 함수 본문

개발/android 개발

[테스트] Mock, Mockito - 사용법, 레시피, when, verify, 유용한 코틀린 함수

알고싶은 승민 2020. 6. 7. 20:01

Mockito

 

Mockito framework site

Intro Why How More Who Links Training Why drink it? Mockito is a mocking framework that tastes really good. It lets you write beautiful tests with a clean & simple API. Mockito doesn’t give you hangover because the tests are very readable and they produc

site.mockito.org

초간단 Mockito 란?

테스트를 편하게 하도록 모의 객체(Mock)를 만드는 Mocking 프레임워크입니다.

초간단 Mock 이란?

모의 객체(Mock)는 실제 구현체가 없고, 껍데기(인터페이스, 메서드, 필드)를 참조할 수 있는 객체입니다.

외부 객체를 Mock 함으로써 테스트할 객체를 외부 객체의 실제 구현 내용과 분리해서 생각할 수 있습니다.

설정

// build.gradle (app 단위)

dependencies {
	...
	testImplementation "org.mockito:mockito-core:3.3.3"
	...
}

 

Mocktio 레시피

Mock 생성

Mockito는 Mock 객체를 위한 프레임워크입니다. 그러면 가장 중요하고 기본적인 Mock 객체 생성이 중요한데요.

@Mock 어노테이션과 MockitoAnnotations를 이용한 초기화

inline 함수를 이용한 초기화

두 가지 방법을 제공합니다. 레시피를 함께 보실까요?🙇‍♂️

@Mock 어노테이션 사용

inline mock() 함수 사용


주로 Mock 객체는, 관심 객체와 상호작용 했는지가 주된 관심사입니다. 따라서 아래 알아볼 다양한 함수들을 통해서 반환 값을 Stub 한다던가, 어떤 상호작용을 했는지 Verify 하는 동작을 하게 되는데요.

 

테스트마다 Mock 객체의 참조가 필요하므로 테스트 클래스의 멤버 변수로 Mock 객체를 들고 있는 게 유리하고, 따라서 어노테이션을 사용한 초기화를 하는 게 권장되는 방식입니다 😄


Stub (feat. when)

when 함수

when 함수를 사용하면, 간단히 Mock 객체의 행동을 설정할 수 있습니다. Mock 객체의 행동을 설정한다는 행위는 다음과 같은 상황으로 해석할 수 있는데요.

ViewModel이 Repository로부터 더미 데이터를 받아올 때 동작을 검증하고 싶다.

서버로부터 오는 데이터를 분류해서, 각 데이터가 떨어질 때 ViewModel이 어떤 동작을 하면 되는가 테스트 코드를 작성해 놓으면 좋겠죠? 🤔

 

when 함수를 사용하면 단순히 "어떤 동작을 할 때~"라는 명시만 주어지는 겁니다. 뒤에 이어서 "어떤 것을 한다"라는 명세를 주는 함수를 함께 알아볼까요? 바로 thenReturn, thenThrow, 그리고 이 모든 것을 포괄하는 thenAnswer입니다. 

 

thenReturn으로 단순한 값 반환

thenThrow로 예외를 던지자.

thenAnswer로 유연하게 Stub


메서드는 매개변수를 가지고 있습니다. 특정 매개변수가 들어왔을 때 동작 검증은 위에 보신 방법으로만 해도 괜찮습니다.

 

하지만 임의의 타입의 매개변수가 들어온 경우를 Stub 하려면 어떻게 해야 할까요? 바로 ArgumentMatchers를 사용하면 됩니다. 😇

 

ArgumentMatchers로 아무 기본 타입에 대응하기

ArgumentMatchers로 아무 참조 타입에 대응하기 (feat. 코틀린 특이점)


검증하기 (feat. verify)

verify 함수

verify함수는 인자로 Mock객체를 받습니다.

그리고 해당 Mock 객체의 원하는 상호작용이 있었는가 검증합니다. 

메서드가 호출되었는지, 필드를 참조했는지가 이에 해당합니다.

 

검증 방법은 여러 가지가 있겠죠? 한 번 호출된 건지, 세 번 호출된 건지, 호출 안된 건지... 걱정하지 마세요. 이 모든 검증 함수들을 Mockito가 이미 만들어 놨습니다.👍

 

특정 횟수만큼 호출되었는가. - times

호출되지 않았는가. - never

최소 몇 번 호출되었는가. - atLeast

최대 몇 번 호출되었는가. - atMost

오직 해당 함수만 실행되었는가 - only


마무리

Mockito는 테스트 코드를 작성할 때 마주하는 모의 객체를 직관적으로 만들고 검증할 수 있도록 도와주는 프레임워크입니다.

java, kotlin을 사용해서 테스트 코드를 사용하는 어떤 경우에도 통용할 수 있는 테스트의 기본 같은 녀석이라고 생각합니다.

Mockito와 함께 쉽고 가독성 좋은 테스트를 만들러 가 볼까요?🏃‍♂️

 

Comments