我对Koin和"androidTest“有个问题。因为androidTest启动了应用程序,所以在测试中我不需要自己启动Koin。
现在我需要注入一个模拟服务。问题是,我使用单例类中的get()注入方法内部,这不能通过构造函数注入工作,因为注入的对象可以有不同的实现。
我的想法是这样声明我需要的东西:
declare {
factory<Webservice>(override = true) { mockWebservice }
}但这将应用于所有测试。这就是另一个检查是否注入了正确的类的测试失败的原因。
我还尝试在@After方法中使用stopKoin(),startKoin(listOf(appModule)),但是在以后的测试中依赖项注入不再起作用。
有没有办法只为一次测试声明mock?
发布于 2019-11-20 23:35:45
下面是我在Android测试中如何做到这一点:
在父测试类中,我使用以下方法进行设置和拆卸:
@Before fun startKoinForTest() {
if (GlobalContext.getOrNull() == null) {
startKoin {
androidLogger()
androidContext(application)
modules(appComponent)
}
}
}
@After fun stopKoinAfterTest() = stopKoin()我的appcomponent包含依赖关系树所需的所有模块。
然后,当我想模拟特定测试的依赖关系时,我会使用如下内容:
declareMock<TripApi> { given(this.fetch(any())).willReturn(TestData.usaTrip) }如果您希望用mock交换依赖项,则需要为每个测试添加一个新的mock声明。
发布于 2018-10-17 12:09:04
要只为一个测试声明mock,可以使用loadKoinModules()
您不能多次调用startKoin()函数。但是您可以直接使用loadKoinModules()函数。
这样你的定义就会覆盖默认的定义
loadKoinModules(module {
factory<Webservice>(override = true) { mockWebservice }
})此外,不要忘记在测试类中实现KoinTest接口
https://stackoverflow.com/questions/52819199
复制相似问题