Kotlin 单元测试 - 如何模拟 Companion 对象的组件?

标签 kotlin mockk

如果我有一个看起来像这样的(简化的)类:

class MyManager @JvmOverloads constructor(/*constructor args*/) : MyManagerInterface {

    @Inject
    lateinit var myLogger: MyLogger

    init {
        component = DaggerLoggerComponent.builder()
                .loggerModule(LoggerModule(internalLogger))
                .build()

        component.inject(this)
    }

    companion object {
        lateinit var component: RemoteLoggerComponent
            private set
    }
}

在进行单元测试时,我到底如何模拟伴随对象中的组件?

我尝试过使用 Mockito、MockK 等各种技巧,但遇到了一些障碍。

CUT(被测类)是另一个使用 MyManager 组件在其 init block 中注入(inject)其依赖项的类,如下所示:
init {
        if(applicationContext == null) {
            throw IllegalStateException("Application Context must not be null")
        } else {

            MyManager.component.inject(this)
        }
    }

基本上,如果注入(inject)什么都不做,我会很高兴,因为我可以在外部设置依赖项以进行测试。

所有帮助表示赞赏。包括如果你认为我写错了。我对 Kotlin 和 Dagger 比较陌生。谢谢。

最佳答案

基本上,使用 MockK,你需要这样的代码:

mockkObject(MyManager)
every { MyManager.component.someOp(...) } returns 5

不确定我是否了解有关注入(inject)的所有细节。正如你所说,你可以禁用它。

关于Kotlin 单元测试 - 如何模拟 Companion 对象的组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51792130/

相关文章:

androidx.lifecycle 或 android.arch.lifecycle

java - Kotlin,响应式(Reactive)编程 : How to consume the value of one function output to another one

android - MockK 模拟 ViewModel 的 savedStateHandle.getLiveData()

android - MockK 中的参数匹配器

android - 每次在 Android 中打开/更改/关闭媒体 session 时如何接收通知?

java - 使用变量进行 Kotlin 元编程

android - 自动化 Java 到 Kotlin 的转换 : unresolved reference to 'ARG_LAYOUT_RES_ID'

unit-testing - Kotlin & MockK - 如果从另一个方法调用模拟方法,则模拟不起作用

android - Dagger 不注入(inject) Activity

kotlin - 如何在界面中模拟Kotlin扩展功能?