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

the*_*_mr 9 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

CUT(被测类)是另一个类,它使用 MyManager 组件在其 init 块中注入其依赖项,如下所示:

init {
        if(applicationContext == null) {
            throw IllegalStateException("Application Context must not be null")
        } else {

            MyManager.component.inject(this)
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

所有帮助表示赞赏。包括您是否认为我编码错误。我对 Kotlin 和 Dagger 比较陌生。谢谢。

小智 24

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

mockkObject(MyManager)
every { MyManager.component.someOp(...) } returns 5
Run Code Online (Sandbox Code Playgroud)

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

  • 不为我工作。 (3认同)