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

时间:2016-10-12 18:23:24

标签: android kotlin kodein

我想使用Kodein在我的Android测试测试中注入模拟覆盖。我不知道哪种方法最适合这样做。这就是我的想法:

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

configurable Kodein extension在这种情况下是否合理,或者是否有更简单,更适合的方法(如果是,那么)?

2 个答案:

答案 0 :(得分:5)

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

val testKodein = Kodein {
    extend(appKodein())

    bind<MyManager>(overrides = true) with singleton { mock<MyManager>() }
}

仅当您使用静态&#34;一个真正的Kodein&#34;时,才建议使用可配置的Kodein选项。使用它可以防止并行运行您的测试(因为它们都访问相同的Kodein实例),并强制您在每次测试之间clear ConfigurableKodein并每次重新声明不同的替代。

答案 1 :(得分:5)

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

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实例并注入覆盖原始图的依赖关系的模拟。唯一需要保证的是,在配置模拟之后启动测试活动,或者行为不可预测。