Koin Android测试

时间:2018-10-15 14:38:52

标签: android dependency-injection kotlin koin

我对Koin和“ androidTest”有疑问。 因为androidTest启动了Application,所以我不需要在测试中亲自启动Koin。

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

我的想法是用这种方式声明我需要什么:

declare {
        factory<Webservice>(override = true) { mockWebservice }
    }

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

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

是否有一种方法只能针对一个测试声明模拟?

2 个答案:

答案 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) }

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