Kotlin 单元测试 - 如何模拟 Companion 对象的组件?
Kotlin Unit testing - How to mock component of Companion object?
如果我有一个(简化的)class,如下所示:
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(class-测试中)是另一个 class,它使用 MyManager 组件将其依赖项注入其 init 块,如下所示:
init {
if(applicationContext == null) {
throw IllegalStateException("Application Context must not be null")
} else {
MyManager.component.inject(this)
}
}
基本上,如果注入什么都不做我会很高兴,因为为了测试我可以在外部设置依赖项。
感谢所有帮助。包括如果你认为我编码错误。我对 Kotlin 和 Dagger 比较陌生。谢谢
基本上,使用 MockK,您需要这样的代码:
mockkObject(MyManager)
every { MyManager.component.someOp(...) } returns 5
不确定我了解有关注射的所有细节。正如您所说,您可以禁用它。
不要忘记取消模拟伴生对象。否则,将在当前测试后使用模拟版本。
被阻止的模拟将自动为我们取消模拟:
mockkObject(MyManager) {
every { MyManager.component.someOp(...) } returns 5
act()
verify {
...
}
}
如果我有一个(简化的)class,如下所示:
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(class-测试中)是另一个 class,它使用 MyManager 组件将其依赖项注入其 init 块,如下所示:
init {
if(applicationContext == null) {
throw IllegalStateException("Application Context must not be null")
} else {
MyManager.component.inject(this)
}
}
基本上,如果注入什么都不做我会很高兴,因为为了测试我可以在外部设置依赖项。
感谢所有帮助。包括如果你认为我编码错误。我对 Kotlin 和 Dagger 比较陌生。谢谢
基本上,使用 MockK,您需要这样的代码:
mockkObject(MyManager)
every { MyManager.component.someOp(...) } returns 5
不确定我了解有关注射的所有细节。正如您所说,您可以禁用它。
不要忘记取消模拟伴生对象。否则,将在当前测试后使用模拟版本。
被阻止的模拟将自动为我们取消模拟:
mockkObject(MyManager) {
every { MyManager.component.someOp(...) } returns 5
act()
verify {
...
}
}