Mockito ??
Mock 을 지원하는 프레임 워크
Mock : 진짜 객체와 비슷하게 동작하지만 프로그래머가 직접, 그 객체의 행동을 관리하는 객체.
Mockito : Mock 객체를 쉽게 만들고 관리하고 검증할 수 있는 방법을 제공한다 .
위 그림과 같이 test 위치에 만들어서 실행 할 수 있다.
또는
클래스에 Alt + Enter
테스팅 라이브러리로 Junit4 사용
실습
1. @RunWith(MockitoJUnitRunner::class) 를 선언
@RunWith란?
JUnit 프레임워크의 테스트 실행방법을 확장할 때 사용하는 어노테이션
즉, ApplicationContext를 만들고 관리하는 작업을
@RunWith(SpringRunner.class)에 설정된 class로 이용하겠다는 뜻입니다.
2. @Test 어노테이션 붙이기
Junit은 @Test가 있는 메소드를 테스트 메소드라고 인식합니다.
3. 테스트 코드 작성 하기
4. 실행하기
test 코드를 프로젝트 트리에서 마우스 오른쪽 클릭하여 Run
// 1.Mockito를 사용하려면 이렇게 Annotation을 붙여줍니다.
@RunWith(MockitoJUnitRunner::class)
class ExampleTest {
// 2. Junit은 @Test가 있는 메소드를 테스트 메소드라고 인식합니다.
@Test
fun testM(){
// 3 Example 클래스를 mocking하여 객체로 만들어줍니다.
val example = Mockito.mock(Example::class.java)
// 4 이 객체의 getId()가 호출되었을 때 100을 리턴하도록 합니다.
Mockito.`when`(example.getId()).thenReturn(100)
// 5 이 객체의 getUrl(100)가 호출되었을 때 https://machine-woong.tistory.com/ 를 리턴하도록 합니다.
// 인자가 꼭 100으로 전달되어야 합니다.
Mockito.`when`(example.getUrl(100))
.thenReturn("https://machine-woong.tistory.com/")
// 6 getId()가 100을 리턴하는지 확인합니다.
assertEquals(100, example.getId())
// 7 getUrl(100)이 https://machine-woong.tistory.com/을 리턴하는지 확인합니다.
assertEquals("https://machine-woong.tistory.com/",
example.getUrl(example.getId()))
}
}
anyInt(), anyString()
위에서 Mocking할 때 인자에 정확한 값을 넣어주었습니다.
인자로 어떤 값을 전달하든 상관이 없다면 anyInt(), anyString()등을 사용할 수 있습니다.
그 외에 다양한 자료형을 지원하는 메소드들이 있습니다.
- anyInt()
- anyString()
- anyBoolean()
- anyDouble()
- anyFloat()
- anyList()
assert메소드 정리
assertArrayEquals(a, b) : 배열 A와 B가 일치함을 확인한다.
assertEquals(a, b) : 객체 A와 B가 같은 값을 가지는지 확인다.
assertEquals(a, b, c) : 객체 A와 B가 값이 일치함을 확인한다.( a: 예상값, b:결과값, c: 오차범위)
assertSame(a, b) : 객체 A와 B가 같은 객체임을 확인한다.
assertTrue(a): 조건 A가 참인지 확인한다.
assertNotNull(a) : 객채 A가 null이 아님을 확인한다.
(더 많은 메소드는 http://junit.sourceforge.net/javadoc/org/junit/Assert.html 참고)
Exception 발생
어떤 API를 호출했을 때 Exception이 발생되도록 할 수도 있습니다.
verify()
verify는 어떤 API가 호출되었는지, 몇번 이상 호출되었는지 체크할 때 사용할 수 있습니다.
어떤 메소드를 호출할 때, 그 메소드 안에서 특정 API를 호출했는지 확인하고 싶을 때 사용할 수 있습니다.
verify(example).getUrl(ArgumentMatchers.eq(100)) // 1
verify(example, times(3)).getId() // 2
verify(example, atLeast(2)).getId() // 3
verify(example, atLeast(1)).getUrl(100) // 4
- getUrl(100)이 호출되었는지 확인합니다.
- getId()가 3번 호출되었는지 확인합니다. 2번만 호출되었다면 테스트는 fail됩니다.
- getId()가 최소 2번은 호출되었는지 확인합니다.
- getUrl(100)이 최소 1번은 호출되었는지 확인합니다.
그 외에 다음 메소드 등을 제공합니다.
- times()
- atLeast()
- atLeastOnce()
- atMost()
이슈
1. Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null) 발생
// 이녀석을 추가해 줬다
testImplementation 'org.mockito:mockito-core:3.8.0'
// 이전에는 이것만 있었다.
testImplementation 'org.mockito:mockito-inline:2.21.0'
androidTestImplementation("org.mockito:mockito-android:2.24.5")
출처: https://devuna.tistory.com/39 [튜나 개발일기]
'Android 공부 > 단위테스트 관련' 카테고리의 다른 글
AndroidX 테스트용 ViewModel, Live Data 테스트 (0) | 2022.05.10 |
---|---|
단위테스트? : ( Mock ) 02 , 테스트 적용과정. (0) | 2022.05.09 |
Mockito : 기능 들? (0) | 2022.05.09 |
Mockito 설치 (0) | 2022.05.09 |
단위테스트? : (JUnit, Mock ) 01 (0) | 2022.03.21 |