![](/img/trans.png)
[英]When I use ViewModel.Factory, appear `Kodein No binding found for bind<Kodein>()` error
[英]Kodein override binding for AndroidTest
在测试我的课程之前,我想通过模拟覆盖 Kodein 绑定。
有我的 Kodein init:
val kodein = Kodein {
bind<MyRepository>() with provider { MyRepository() }
}
然后我的班级来测试:
class MyClass {
private val mMyRepository: MyRepository by kodein.instance()
suspend fun sendData() = mMyRepository.sendData()
}
还有我的测试课:
@RunWith(AndroidJUnit4::class)
class MyClassTest {
@MockK
lateinit var mMyRepositoryMock: MyRepository
val mMyClass = MyClass()
@Before
fun setUp() {
MockKAnnotations.init(this, relaxUnitFun = true)
}
@Test
fun testSendData() {
coEvery { mMyRepositoryMock.sendData() } returns Unit
runBlocking {
mMyClass.sendData()
.collect {
assertTrue(true)
}
}
}
}
我想在测试期间通过mMyRepositoryMock
覆盖MyClass
中的mMyRepository
值。
有人可以帮我做吗?
这正是我们不建议使用全局 Kodein 实例的原因。
确保类可测试性的最佳方法是删除其上下文相关性。
考虑以下类:
class MyClass(override val kodein: Kodein) {
private val mMyRepository: MyRepository by kodein.instance()
suspend fun sendData() = mMyRepository.sendData()
}
现在它使用的kodein
作为参数传递,因此可以为测试正确配置:
@RunWith(AndroidJUnit4::class)
class MyClassTest {
@MockK
lateinit var mMyRepositoryMock: MyRepository
val kodein by Kodein.lazy {
bind<MyRepository>() with provider { mMyRepositoryMock }
}
val mMyClass by lazy { MyClass(kodein) }
@Before
fun setUp() {
MockKAnnotations.init(this, relaxUnitFun = true)
}
@Test
fun testSendData() {
coEvery { mMyRepositoryMock.sendData() } returns Unit
runBlocking {
mMyClass.sendData()
.collect {
assertTrue(true)
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.