我对Koin和“ androidTest”有疑问。 因为androidTest启动了Application,所以我不需要在测试中亲自启动Koin。
现在我需要注入一个模拟服务。问题是,我将方法注入到具有单例类内部的get()的方法内部,并且这不能通过构造函数注入而起作用,因为注入的对象可以具有不同的实现。
我的想法是用这种方式声明我需要什么:
declare {
factory<Webservice>(override = true) { mockWebservice }
}
但这将适用于所有测试。这就是为什么另一个检查(是否注入了正确的类)的测试失败的原因。
我还尝试在@After方法中使用stopKoin()和startKoin(listOf(appModule)),但是在以后的测试中,依赖注入不再起作用。
是否有一种方法只能针对一个测试声明模拟?
答案 0 :(得分:1)
要仅对一个测试声明模拟,可以使用loadKoinModules()
您不能多次调用startKoin()函数。但是您可以直接使用loadKoinModules()函数。
这样,您的定义将覆盖默认值
loadKoinModules(module {
factory<Webservice>(override = true) { mockWebservice }
})
此外,不要忘记在测试类中实现KoinTest
接口
答案 1 :(得分:0)
这是我在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) }
如果您希望与模拟交换依赖项,则需要为每个测试添加一个新的模拟声明。