android - 用于 AndroidTest 的 Kodein 覆盖绑定
问题描述
我想在测试我的课程之前通过模拟覆盖 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)
}
}
}
}
我想mMyRepository
在MyClass
测试期间通过mMyRepositoryMock
.
有人可以帮我做吗?
解决方案
这正是我们不建议使用全局 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)
}
}
}
}
推荐阅读
- c# - 在原生 c++ 应用程序中使用 Entity Framework Core 5 (ef-core-5.0)
- html - 如何像我的示例界面设计一样将图像设置为圆形
- html - Wordpress 主菜单工作,但其子菜单不显示。如何在标题中正确显示
- python - 将 CSV 文件从云存储加载到 Big Query 时出现“禁止:403 超出速率限制:此表的表更新操作过多”
- javascript - 如果结束日期小于反应中的开始日期,如何验证小于反应开始日期的结束日期并在横幅中添加错误消息
- amazon-web-services - 如何在 AWS 控制台上为自定义字段的日期创建时间戳字段?
- monitoring - 在特定时间段使用 python 监控 FileLog
- angular - 如何在我的 sidenav 之外显示我的模态?我正在使用:主机。角
- crud - 如何在自定义管理 CRUD 控制器中实现具有两个关联字段的依赖选择(EasyAdminBundle 3、Symfony 5)
- ms-access - 如何从两个表中有共同值的 1 个表中查询值