首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Koin Android测试

Koin Android测试
EN

Stack Overflow用户
提问于 2018-10-15 22:38:52
回答 2查看 4.2K关注 0票数 1

我对Koin和"androidTest“有个问题。因为androidTest启动了应用程序,所以在测试中我不需要自己启动Koin。

现在我需要注入一个模拟服务。问题是,我使用单例类中的get()注入方法内部,这不能通过构造函数注入工作,因为注入的对象可以有不同的实现。

我的想法是这样声明我需要的东西:

代码语言:javascript
复制
declare {
        factory<Webservice>(override = true) { mockWebservice }
    }

但这将应用于所有测试。这就是另一个检查是否注入了正确的类的测试失败的原因。

我还尝试在@After方法中使用stopKoin(),startKoin(listOf(appModule)),但是在以后的测试中依赖项注入不再起作用。

有没有办法只为一次测试声明mock?

EN

回答 2

Stack Overflow用户

发布于 2019-11-20 23:35:45

下面是我在Android测试中如何做到这一点:

在父测试类中,我使用以下方法进行设置和拆卸:

代码语言:javascript
复制
@Before fun startKoinForTest() {
    if (GlobalContext.getOrNull() == null) {
        startKoin {
            androidLogger()
            androidContext(application)
            modules(appComponent)
        }
    }
}

@After fun stopKoinAfterTest() = stopKoin()

我的appcomponent包含依赖关系树所需的所有模块。

然后,当我想模拟特定测试的依赖关系时,我会使用如下内容:

代码语言:javascript
复制
declareMock<TripApi> { given(this.fetch(any())).willReturn(TestData.usaTrip) }

如果您希望用mock交换依赖项,则需要为每个测试添加一个新的mock声明。

票数 3
EN

Stack Overflow用户

发布于 2018-10-17 12:09:04

要只为一个测试声明mock,可以使用loadKoinModules()

您不能多次调用startKoin()函数。但是您可以直接使用loadKoinModules()函数。

这样你的定义就会覆盖默认的定义

代码语言:javascript
复制
loadKoinModules(module {
    factory<Webservice>(override = true) { mockWebservice }
})

此外,不要忘记在测试类中实现KoinTest接口

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52819199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档