Android 공부/단위테스트 관련

Mocking 및 Unit test 작성 01

Machine_웅 2022. 5. 9. 15:08
728x90
반응형

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
  1. getUrl(100)이 호출되었는지 확인합니다.
  2. getId()가 3번 호출되었는지 확인합니다. 2번만 호출되었다면 테스트는 fail됩니다.
  3. getId()가 최소 2번은 호출되었는지 확인합니다.
  4. 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 [튜나 개발일기]

728x90
반응형