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
.
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! 🥛