android - Koin 安卓测试

标签 android dependency-injection kotlin koin

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

相关文章:

android - 使用 Glide 刷新 ImageView

android - Debug.waitForDebugger();不在 Android 工作室工作

android - 使用 Dialog 自定义屏幕变暗

sql-server - 在 node.js 中使用带有存储库模式的 SQL Server 和 mongodb

AndroidX JetPack NavigationUI - 覆盖抽屉中非导航项目的操作

android - 我应该下载哪个 API 级别来开发 Android 应用程序

unit-testing - MassTransit 服务总线配置和单元测试

java - 运行时的依赖确定

android - View.VISIBLE和INVISIBLE不起作用Kolin

android - picasso 图书馆错误 Unresolved reference