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

时间:2018-08-10 18:22:27

标签: 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块的类,如下所示:

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

            MyManager.component.inject(this)
        }
    }

基本上,如果注入不执行任何操作,我会很高兴,因为我可以在外部设置依赖项以进行测试。

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

2 个答案:

答案 0 :(得分:4)

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

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

不确定我是否了解有关注射的所有详细信息。如您所说,您可以禁用它。

答案 1 :(得分:0)

不要忘记取消模拟伴生对象。否则,应在当前测试之后使用模拟版本。

被阻止的模拟将自动为我们解除模拟:

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

  act() 

  verify {
    ...
  }

}