如何将测试覆盖注入到默认的依赖关系图?
我想使用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
。 唯一需要保证的是测试活动在配置模拟之后启动,或者行为是不可预测的。