[TDD] UnitTest Android 종속성 회피하기

안녕하세요.
오늘 해볼 얘기는 Android 종속성이 들어가있는것을 Mock으로 회피하는것에 대해 알아봅시다.

Unit테스트를 하다보면, 어쩔수없이 안드로이드 종속성을 피할수 없는것들이 있습니다.
예를들어 Uri.Parse라던가..던가 말이죠.


또한 안드로이드 종속이 들어가있는 static Variable 또한 문제가 발생 합니다.

이러한 종속성을 회피하기 위한 방법은 두가지가 있습니다.

robolectric 사용하기

robolectric은 Android가 아닌 환경에서도 Android 동작을 시뮬레이션 할수있는 프레임워크 입니다.
실제 에뮬레이션 없이도 Application Context객체를 사용할 수 있죠.

사용방법은 Test하는 class 위쪽에 @RunWith(RobolectricTestRunner::class) 를 붙이는 것입니다.

@RunWith(RobolectricTestRunner::class)
@Config(sdk = [Build.VERSION_CODES.O_MR1])
class MainActivityTest {
    // Test methods go here
}

mock으로 회피하기

robolectric이 사용하기 불편하다면 Mock을 사용하여 회피 또한 가능합니다.

    @Before
    fun setUp() {
        fakeDeviceProvider = FakeDeviceProvider()

        mockkStatic("android.util.Base64")
        mockkStatic("android.util.Log")
        //디코딩용 Mock
        every {
            Base64.decode(
                any() as ByteArray,
                any()
            )
        } returns byteArrayOf()
		//Logging용 Mock
        every {
            android.util.Log.d(
                any(),
                any()
            )
        } returns 0

        every {
            android.util.Log.w(
                any() as String,
                any() as String
            )
        } returns 0

        every { Base64.encodeToString(any(), any()) } returns ""
    }

저는 Mockk 라이브러리를 사용하였습니다만, 다른 Mock라이브러리 또한 지원할 것 같습니다.

어느것이 좋을까?

좀 더 불편한것은 Mock객체를 만들어 종속성을 회피하는것입니다.

하지만 이러한 노고가 있음에도 불구하고, 속도가 robolectric보다 빠르진 않았습니다.
오히려 robolectric보다 느리거나 비슷한 수준을 보여줬는데요.
robolectric을 쓰지 못하는 환경이 아니고서야 안쓸 이유는 없어 보입니다.

참고

RuntimeException: Method encodeToString in android.util.Base64 not mocked.
Robolectric: Android 개발자를 위한 최고의 테스트 프레임워크

profile
쉽게 가르칠수 있도록 노력하자

0개의 댓글