#java #android #unit-testing #kotlin #mockito
#java #Android #модульное тестирование #kotlin #mockito
Вопрос:
У меня есть класс приложения.
open class AppController : MultiDexApplication() {
companion object {
@JvmStatic
lateinit var instance: AppController
private set
}
override fun onCreate() {
super.onCreate()
instance = this
}
}
Я использую свой код для расширения.
Int.kt
fun Int.pxToDp(): Int {
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, this.toFloat(), AppControllerMaster.instance.applicationContext.resources.displayMetrics).toInt()
}
Мне нужно использовать это в модульном тестировании.
при использовании этого я получаю эту ошибку
kotlin.UninitializedPropertyAccessException: lateinit property instance has not been initialized
Мне нужно создать макет или альтернативу AppController.class в моем модульном тесте.
Мне нужно использовать его в UnitTest, а не в androidTest.
как приложение может критиковать или издеваться в UNITTEST?
Ответ №1:
Обратитесь http://robolectric.org /
Robolectric is a framework that brings fast and reliable unit tests to Android.
Tests run inside the JVM on your workstation in seconds
Ответ №2:
Я нашел ответ без использования Robolectric.
Я создаю расширение функции в пакете com.example в классе с именем ContextEX.kt
ContextEX.kt
fun Any.getContextEX(): Context {
return AppController.instance
}
и измените расширение pxToDp.
изменить AppControllerMaster.instance.applicationContext
на getContextEX()
.
fun Int.pxToDp(): Int {
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, this.toFloat(), getContextEX().resources.displayMetrics).toInt()
}
и в тесте я имитирую класс приложения и расширение контекста с помощью библиотеки Mockk
val context: Context = spyk()
// Mock Context extension
mockkStatic("com.example.ContextEXKt") // notic: not ContextEX.kt
val metrics: DisplayMetrics = mockk()
val resources: Resources = mockk()
every {
any<Any>().getContext()
}.answers {
context
}
every {
any<Any>().getContext().resources
}.answers {
resources
}
every {
any<Any>().getContext().resources.displayMetrics
}.answers {
metrics
}