我对 Koin 和“androidTest”有疑问。 因为 androidTest 启动了应用程序,所以我不需要在测试中自己启动 Koin。
现在我需要注入(inject)一个模拟服务。问题是,我在单例类中使用 get()
注入(inject)方法内部,这无法通过构造函数注入(inject)工作,因为注入(inject)的对象可以有不同的实现。
我的想法是以这种方式声明我需要的东西:
declare {
factory<Webservice>(override = true) { mockWebservice }
}
但这将应用于所有测试。这就是为什么另一个测试(检查是否注入(inject)了正确的类)失败了。
我还尝试在 @After
方法中使用 stopKoin()
, startKoin(listOf(appModule))
,但是有了这个依赖注入(inject)在以后的测试中不再起作用。
有没有办法只为一个测试声明模拟?
最佳答案
这是我在 Android 测试中的做法:
在父测试类中,我使用这些方法进行设置和拆卸:
@Before fun startKoinForTest() {
if (GlobalContext.getOrNull() == null) {
startKoin {
androidLogger()
androidContext(application)
modules(appComponent)
}
}
}
@After fun stopKoinAfterTest() = stopKoin()
我的应用程序组件包含依赖树所需的所有模块。
然后,当我想模拟特定测试的依赖项时,我会使用这样的东西:
declareMock<TripApi> { given(this.fetch(any())).willReturn(TestData.usaTrip) }
如果您希望将依赖项与 mock 交换,则需要为每个测试添加一个新的 mock 声明。
编辑:申请是这样得到的:
protected val instrumentationContext: Context = InstrumentationRegistry.getInstrumentation().targetContext
protected val application = instrumentationContext.applicationContext as Application
关于android - Koin 安卓测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52819199/