使用Koin进行正确的仪器测试

问题描述

无法使此东西正常工作。

  1. 我已在测试运行器下注册自定义测试应用程序:
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之类的东西,超级简单!