1

我对 Koin 和“androidTest”有疑问。因为 androidTest 启动应用程序我不需要在测试中自己启动 Koin。

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

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

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

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

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

有没有办法只为一个测试声明模拟?

4

2 回答 2

3

这是我在 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) }

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

于 2019-11-20T15:35:44.853 回答
2

要为一项测试声明模拟,您可以使用loadKoinModules()

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

所以这样你的定义将覆盖默认的

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

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

于 2018-10-17T04:09:04.077 回答