在测试我的类之前,我想用模拟覆盖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)
}
}
}
}在MyClass测试期间,我希望在mMyRepositoryMock中覆盖mMyRepositoryMock值。
有人能帮我吗?
发布于 2020-03-12 11:15:41
这正是我们不建议使用全局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)
}
}
}
}https://stackoverflow.com/questions/60652561
复制相似问题