繁体   English   中英

AndroidTest 的 Kodein 覆盖绑定

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM