【问题标题】:Application.class mock in Android UnitTestAndroid UnitTest 中的 Application.class 模拟
【发布时间】:2020-10-20 14:57:05
【问题描述】:

我有一个应用程序类。

open class AppController : MultiDexApplication() {

    companion object {

        @JvmStatic
        lateinit var instance: AppController
            private set

    }

    override fun onCreate() {
        super.onCreate()

        instance = this
    }

}

我使用我的代码进行扩展。 诠释.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 中进行 Application Crete 或 mock?

【问题讨论】:

    标签: java android unit-testing kotlin mockito


    【解决方案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
    
    

    【讨论】:

    • 我需要在 JUnit 测试中使用(本地测试)并且不使用 Robolectric
    【解决方案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 库模拟 Application 类和上下文扩展

    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
    }
    

    【讨论】:

      猜你喜欢
      • 2021-04-12
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多