如何将测试覆盖注入默认依赖关系图中?
How to inject test overrides into the default dependency graph?
我想使用 Kodein 将模拟覆盖注入到我的 Android 仪器测试中。我不知道哪个是执行此操作的最佳方法。这是我的想法:
- 我的应用程序使用
KodeinAware
应用程序 class。服务的 Kodein 实例包含我的应用程序所需的所有依赖项。
- 在我的测试中,我想为特定依赖项注入模拟覆盖,以测试应用程序在各种情况下的行为。
- 每个测试的覆盖应该不同,并且应该注入 before/while 测试运行。
configurable Kodein extension 在这种情况下是否明智,或者是否有更简单、更适合的方法(如果有,是哪种)?
如果为您的测试提供了一个 Kodein
实例(这意味着它可以使用与您的 Application
持有的对象不同的 Kodein
对象),那么推荐的方法是创建一个新的 Kodein 对象,扩展应用程序之一并覆盖所有必要的绑定。
val testKodein = Kodein {
extend(appKodein())
bind<MyManager>(overrides = true) with singleton { mock<MyManager>() }
}
仅当您使用静态 "one true Kodein" 时才推荐使用可配置的 Kodein 选项。使用它可以防止 运行 你并行测试的可能性(因为它们都访问同一个 Kodein 实例),并迫使你在每个测试之间 clear
ConfigurableKodein
并重新声明每次都有不同的覆盖。
我现在在自定义 App
class.
中使用 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 中,我声明配置是可变的。这样我就可以在每次测试之间重置它的配置。
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
实例并注入覆盖原始图依赖项的模拟。唯一需要保证的是被测试的 activity 在 配置 mocks 之后 启动,否则行为是不可预测的。
我想使用 Kodein 将模拟覆盖注入到我的 Android 仪器测试中。我不知道哪个是执行此操作的最佳方法。这是我的想法:
- 我的应用程序使用
KodeinAware
应用程序 class。服务的 Kodein 实例包含我的应用程序所需的所有依赖项。 - 在我的测试中,我想为特定依赖项注入模拟覆盖,以测试应用程序在各种情况下的行为。
- 每个测试的覆盖应该不同,并且应该注入 before/while 测试运行。
configurable Kodein extension 在这种情况下是否明智,或者是否有更简单、更适合的方法(如果有,是哪种)?
如果为您的测试提供了一个 Kodein
实例(这意味着它可以使用与您的 Application
持有的对象不同的 Kodein
对象),那么推荐的方法是创建一个新的 Kodein 对象,扩展应用程序之一并覆盖所有必要的绑定。
val testKodein = Kodein {
extend(appKodein())
bind<MyManager>(overrides = true) with singleton { mock<MyManager>() }
}
仅当您使用静态 "one true Kodein" 时才推荐使用可配置的 Kodein 选项。使用它可以防止 运行 你并行测试的可能性(因为它们都访问同一个 Kodein 实例),并迫使你在每个测试之间 clear
ConfigurableKodein
并重新声明每次都有不同的覆盖。
我现在在自定义 App
class.
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 中,我声明配置是可变的。这样我就可以在每次测试之间重置它的配置。
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
实例并注入覆盖原始图依赖项的模拟。唯一需要保证的是被测试的 activity 在 配置 mocks 之后 启动,否则行为是不可预测的。