← beranda

Mock Private Property dengan MockK

Context

MockK merupakan salah satu library yang dapat kita gunakan untuk testing pada Android. Banyak API yang telah disedikan yang memudahkan kita untuk melakukan testing, mocking private method misalnya. Seperti yang kita ketahui, mockK memiliki infix extension getProperty() yang dapat kita gunakan untuk mocking terhadap private function yang ada pada class. Tapi, getProperty() tersebut belum mendukung untuk sebuah private property. Alasannya, karena sebuah property yang private tidak memiliki getter/setter.

MockK #104 issue

Solution

Lalu, bagaimana agar dapat melakukan mocking terhadap private property? Kita dapat melakukan secara sederhana, dengan menggunakan class reflection seperti berikut:

data class MockProperty(var propertyName: String, var value: Any)

private infix fun Any.mockProperty(property: MockProperty): Any {
    javaClass.declaredFields
        .filter { it.modifiers.and(Modifier.PRIVATE) > 0 || it.modifiers.and(Modifier.PROTECTED) > 0 }
        .firstOrNull { it.name == property.propertyName}
        ?.also { it.isAccessible = true }
        ?.set(this, property.value)
    return this
}

Cara menggunakannya pun cukup mudah:

class Foo {
    private var isSuccess = false

    fun isSuccessStatus() = isSuccess
}

class FooTest {
    
    private val foo = Foo()

    @Test `it should be return isSuccess as true`() {
        // Given
        val expectedValue = true
        foo mockProperty MockProperty("isSuccess", expectedValue)

        // When
        val result = foo.isSuccessStatus()

        // Then
        assertTrue { result == expectedValue }
    }
}

Cheers! 🥛