如何将测试覆盖注入到默认的依赖关系图?

我想使用Kodein将嘲笑覆盖注入到我的Android仪器测试中。 我不知道哪个是最好的方法来做到这一点。 以下是我的想法:

  • 我的应用程序使用KodeinAware应用程序类。 服务的Kodein实例拥有我的应用程序所需的所有依赖关系。
  • 在我的测试中,我想注入特定的依赖关系的模拟覆盖,以测试在各种情况下的应用程序的行为。
  • 对于每个测试,覆盖应该是不同的,并且应该在测试运行之前/之前注入。

在这种情况下,可配置的Kodein扩展是否合理,还是有一个更简单,更合适的方法(如果是的话)?

如果你的测试有一个Kodein实例(意思是它可以使用与你的Application不同的Kodein对象),那么推荐的方法是创建一个新的Kodein对象,它扩展了应用程序和覆盖所有必要的绑定。

 val testKodein = Kodein { extend(appKodein()) bind<MyManager>(overrides = true) with singleton { mock<MyManager>() } } 

只有在使用静态的“一个真正的Kodein”时才推荐配置Kodein选项。 使用它可以防止并行运行测试(因为它们都访问相同的Kodein实例),并强制您clear每个测试之间的ConfigurableKodein ,并在每次重写时重新声明。

我现在在我的自定义App类中使用ConfigurableKodein

 class App : Application(), KodeinAware { override val kodein = ConfigurableKodein() override fun onCreate() { super.onCreate() // A function is used to create a Kodein module with all app deps. kodein.addImport(appDependencies(this)) } } // Helper for accessing the App from any context. fun Context.asApp() = this.applicationContext as App 

在我的AppTestRunner类中,我声明配置是可变的。 这样我就可以重置每个测试之间的配置。

 class AppTestRunner : AndroidJUnitRunner() { override fun callApplicationOnCreate(app: Application) { app.asApp().kodein.mutable = true super.callApplicationOnCreate(app) } } 

我已经创建了一个JUnit规则,在每次测试之前重置依赖关系图。

 class ResetKodeinRule : ExternalResource() { override fun before() { val app = InstrumentationRegistry.getInstrumentation().targetContext.asApp() app.kodein.clear() app.kodein.addImport(appDependencies(app)) } } 

在我的测试中,我现在可以检索App.kodein实例,并注入重写原始图的依赖关系的App.kodein 。 唯一需要保证的是测试活动配置模拟之后启动,或者行为是不可预测的。