Application.class макет в Android UnitTest

#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
}