ABOUT ME

-

  • Android) Mockito로 Unit Test 작성해보기 - Kotlin
    Android 2020. 12. 2. 21:34

     

    실제 기기에서 테스트를 실행함으로써 얻는 신뢰도가 필요하지 않은 경우 로컬 단위 테스트를 사용하여 테스트를 할 수 있는데,

    이 때, 테스트에 최소한 Android 프레임워크 종속 항목이 있거나 테스트가 고유한 객체에만 종속되어 있다면 모의 프레임워크를 사용하는 방법인 Mockito 방법이 있습니다. 


     

    Unit Test

    • 메서드를 테스트하는 또 다른 메서드. 하나의 단위 테스트(Unit Test)는 하나의 메서드의 특정 루틴을 검사합니다.
    • 구현 단계에서 각 모듈의 개발을 완료한 후 개발자가 명세서의 내용대로 정확히 구현되었는지를 테스트하는 것입니다.
    사용하는 부분
    • 복잡한 기능을 가진 구현 부분
    • 시간이 지남에 따라, 변경 가능성이 큰 구현 부분
    • 비즈니스 로직
    • 공개 API
    • 결함이 있었던 구현 부분
    • 수정이 완료된 이슈
    장점
    • 기능 동작에 대한 신속한 피드백
    • 신속한 결함 체크
    • 프래그램의 신뢰도 상승
    • 안전한 리팩토링 가능
    단점
    • Unit Test 작성시에 시간이 소요된다. -> 장기적으로는 디버깅 시간이 단축되어 오히려 시간 절약됨
    • Test가 가능한 구조로 코드가 작성되어야 함 -> 설계, 유지보수가 잘 된 프로젝트가 강요됨

     


     

     

    Mockito

    • 테스트를 편하게 하도록 모의 객체(Mock)를 만드는 Mocking 프레임워크
    • Junit과 함께 Unit test를 작성하는데 사용되고, Android에서도 Unit test를 작성하는데 공식적으로 Mockito권장하고 있습니다.

     

    Android 프로젝트에서 로컬 단위 테스트를 하려면 소스 파일을 아래처럼 반드시 project-name/src/test/java/에 저장해줘야 합니다.

    이 경로는 새 프로젝트를 만들 때 자동으로 생성됩니다.

     

     

    Gradle 설정

    앱의 최상위 수준 buidl.gradle(:app) 파일에 아래와 같이 의존성을 설정합니다.

    dependencies { 
    	testImplementation 'junit:junit:4.12'
        	testImplementation 'org.mockito:mockito-inline:2.28.0' 
        	androidTestImplementation 'com.android.support.test:runner:1.0.2'
    }

    2번째 라인에 org.mockito:mockito-core를 사용해도 되지만, kotlin에서 에러가 자주 발생함으로 위와 같이 설정해주는 것이 좋습니다.

     

     

    오류 : "메서드의 .. 모의 객체가 생성되지 않았습니다." 

    • 모의 객체를 생성하지 않은 Android SDK의 API를 호출하는 테스트를 실행하게 되면 위와 같은 오류가 발생합니다.
    • 그 이유는 단위 테스트를 실행하는 데 사용되는 android.jar 파일에 실제 코드가 포함되어 있지 않기 때문입니다.
    • 해당 오류가 테스트에 문제가 되면 프로젝트의 최상위 수준 build.gradle 파일에 다음 구성을 추가하여 메서드가 대신 null 또는 0을 반환하도록 동작을 변경할 수 있습니다.

     

    android {    
    	...      
    	testOptions {      
    		unitTests.returnDefaultValues = true     
    	}  
    }

     

     


    Example

     

    함수를 호출하기 위해 사용할 Example 클래스를 만들어줍니다.

     

     


     

    • Example.kt

     

     

     

     

    test 패키지 안에 CalculatorTest 클래스를 만들어줍니다.

     

    • Calculoator.kt

    1. Mockito를 사용하기 위해 @RunWith(MockitoJUnitRunner::class) Annotation을 붙여줍니다.
    2. Junit에서 @Test가 있는 메소드를 테스트 메소드로 인식하기 때문에 Annotation을 붙여줍니다.
    3. 위에서 만든 Example 클래스를 mocking하여 모의 객체로 만들어줍니다.
    4. getSum() 메소드가 호출되고 인자로 100, 200을 넣어주었고 그 합의 결과로 300을 리턴하도록 합니다.
    5. assertEquals로 300을 리턴하는지 확인한다. 테스팅을 위해 100을 예상 값으로 넣어주었고 결과는 아래와 같이 나옵니다.

     

     

     

    6. 예상 값을 300으로 수정해주고 다시 테스팅을 하면 아래와 같은 결과가 나옵니다.

     


    로컬 단위 테스트 실행 방법

     

    1. Sync Project를 클릭하여 프로젝트와 Gradle을 동기화 합니다.
    2. 다음 방법 중 하나로 테스트를 합니다.

     

    • 단일 테스트를 실행하려면 Project 창을 연 후 테스트를 마우스 오른쪽 버튼으로 클릭하고 Run  클릭.
    • 클래스의 모든 메서드를 테스트하려면 테스트 파일에 있는 클래스 또는 메서드를 마우스 오른쪽 버튼으로 클릭하고 Run 클릭.
    • 디렉터리/패키지에 있는 모든 클래스의 테스트를 실행하려면 해당 패키지에서 마우스 오른쪽 버튼으로 클릭하고 Run tests 선택.

     

     

    결론 : Mockito에 다양한 메소드를 제공하고 있는데, 아주 일부만 사용해서 테스팅을 해봤습니다. 익숙하지 않아서 어렵게 느껴지는데

    점차 사용을 늘려가보도록 해야겠습니다.

     


    Reference

    안드로이드 공식 문서

    Mockito 예제

     

    반응형

    댓글

Designed by Me.