gpt4 book ai didi

android - Koin 安卓测试

转载 作者:行者123 更新时间:2023-11-29 23:30:19 25 4
gpt4 key购买 nike

我对 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com