使用 Koin 进行适当的仪器测试
Proper instrumentation test with Koin
无法让这个东西正常工作。
- 我在测试运行程序下注册了自定义测试应用程序:
class HelloInstrumentationTestRunner : AndroidJUnitRunner() {
override fun newApplication(
cl: ClassLoader?, className: String?, context: Context?
): Application {
return Instrumentation.newApplication(HelloTestApp::class.java, context)
}
}
- 我的应用程序实例像往常一样启动 koin:
startKoin {
androidLogger()
androidContext(applicationContext)
fragmentFactory()
modules(appModule + viewModelsModule)
}
- 问题 1:在我的仪器测试中,我不能做
stopKoin()
(说没有配置 Koin 上下文。请使用 startKoin 或 koinApplication DSL)
- 问题 2:当我尝试在 @After 中使用 unloadKoinModules/loadKoinModules 解决问题时,我的
declareMock
in 后续测试方法不再有效。
所有这些问题基本上是因为应用程序实例在测试之间存活,因此在 android 应用程序实例内部配置的图形也在测试之间存活。我希望这种情况不会发生,或者至少能够在测试之间修改图表。
已解决。
- 我必须设置覆盖模块:
val overrideModule = module(override = true) {
single<Repository1> {
mock(Repository1::class.java)
}
single { Repository2(get(), get()) }
single<Repository3> {
mock(Repository3::class.java)
}
...
}
- 在我的@BeforeTest 中,我现在做
loadKoinModules(overrideModule)
- 在我的@AfterTest 中,我做
unloadKoinModules(overrideModule)
- 在我的测试中,我现在可以做:
given(get<Repository1>().magicCall()).willReturn(
MagicData(
"1111",
Calendar.getInstance().timeInMillis
)
)
无需处理 stopKoin 之类的东西,超级简单!
无法让这个东西正常工作。
- 我在测试运行程序下注册了自定义测试应用程序:
class HelloInstrumentationTestRunner : AndroidJUnitRunner() {
override fun newApplication(
cl: ClassLoader?, className: String?, context: Context?
): Application {
return Instrumentation.newApplication(HelloTestApp::class.java, context)
}
}
- 我的应用程序实例像往常一样启动 koin:
startKoin {
androidLogger()
androidContext(applicationContext)
fragmentFactory()
modules(appModule + viewModelsModule)
}
- 问题 1:在我的仪器测试中,我不能做
stopKoin()
(说没有配置 Koin 上下文。请使用 startKoin 或 koinApplication DSL) - 问题 2:当我尝试在 @After 中使用 unloadKoinModules/loadKoinModules 解决问题时,我的
declareMock
in 后续测试方法不再有效。
所有这些问题基本上是因为应用程序实例在测试之间存活,因此在 android 应用程序实例内部配置的图形也在测试之间存活。我希望这种情况不会发生,或者至少能够在测试之间修改图表。
已解决。
- 我必须设置覆盖模块:
val overrideModule = module(override = true) {
single<Repository1> {
mock(Repository1::class.java)
}
single { Repository2(get(), get()) }
single<Repository3> {
mock(Repository3::class.java)
}
...
}
- 在我的@BeforeTest 中,我现在做
loadKoinModules(overrideModule)
- 在我的@AfterTest 中,我做
unloadKoinModules(overrideModule)
- 在我的测试中,我现在可以做:
given(get<Repository1>().magicCall()).willReturn(
MagicData(
"1111",
Calendar.getInstance().timeInMillis
)
)
无需处理 stopKoin 之类的东西,超级简单!