使用Koin进行适当的仪器测试



无法使此功能正常工作。

  1. 我在testrunner下注册了自定义测试应用程序:
class HelloInstrumentationTestRunner : AndroidJUnitRunner() {
override fun newApplication(
cl: ClassLoader?, className: String?, context: Context?
): Application {
return Instrumentation.newApplication(HelloTestApp::class.java, context)
}
}
  1. 我的应用程序实例像往常一样启动koin:
startKoin {
androidLogger()
androidContext(applicationContext)
fragmentFactory()
modules(appModule + viewModelsModule)
}
  1. 问题1:在我的仪器测试中,我无法执行stopKoin()(表示未配置Koin上下文。请使用startKoin或koinApplication DSL(
  2. 问题2:当我试图解决@After中unloadKoinModules/loadKoinModules的情况时,我在后续测试方法中的declareMock不再工作

所有这些问题基本上都是因为应用程序实例在测试之间存活,因此android应用程序实例内部配置的图也在测试之间生存。我需要这种情况不要发生,或者至少有能力在测试之间修改图表。

已解决。

  1. 我必须设置超控模块:
val overrideModule = module(override = true) {
single<Repository1> {
mock(Repository1::class.java)
}
single { Repository2(get(), get()) }
single<Repository3> {
mock(Repository3::class.java)
}
...
}
  1. 在我的@BeforeTest中,我现在做loadKoinModules(overrideModule)
  2. 在我的@AfterTest中,我做unloadKoinModules(overrideModule)
  3. 在我的测试中,我现在可以做到:
given(get<Repository1>().magicCall()).willReturn(
MagicData(
"1111",
Calendar.getInstance().timeInMillis
)
)

不需要处理stopKoin之类的事情,超级简单!

最新更新