如何使用 Dagger 2.11 注入模拟
How to inject mocks with Dagger 2.11
我正在尝试使用 Dagger 2.11 的 Android 注入器注入模拟。
在使用 Android 注入之前,我曾经更改应用程序中的注入器 class 以便我可以注入模拟。像这样:
class EGOApplication : Application() {
lateinit var injectorComponent: InjectorComponent
override fun onCreate() {
super.onCreate()
injectorComponent = DaggerInjectorComponent.builder()
.appModule(AppModule(this))
.build()
}
在我的测试中,我曾经像这样更改 injectorComponent:
app.injectorComponent = DaggerMockComponent.builder()
.mockModule(MockModule(app))
.build()
然后我可以从 MockModule 中注入我的模拟。
但现在我正在使用本教程中的 Android 注射器:https://medium.com/@iammert/new-android-injector-with-dagger-2-part-1-8baa60152abe
嗯...现在我像这样注入我的依赖项:
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
}
所以我的方法不再有效了...如何从我的 MockModule 中创建 Dagger 注入器依赖项?
感谢任何帮助!
我找到了答案。
我在测试中更改了 injectorComponent...像这样:
@Inject
lateinit var someDependency: SomeDependency
val app = instrumentation.targetContext.applicationContext as MyApplication
app.injectorComponent = DaggerMockComponent.builder()
.mockModule(MockModule(app))
.build()
if (null == mockComponent) {
mockComponent = app.injectorComponent as MockComponent
mockComponent!!.inject(this)
}
我的申请大致是这样的:
open class MyApplication : Application(), HasActivityInjector {
@Inject
lateinit var androidInjector : DispatchingAndroidInjector<Activity>
lateinit var injectorComponent: InjectorComponent
override fun onCreate() {
super.onCreate()
buildInjector()
}
open fun buildInjector() {
injectorComponent = DaggerInjectorComponent.builder()
.dataModule(DataModule())
.appModule(AppModule(this))
.trackerModule(TrackerModule(this, FirebaseAnalytics.getInstance(this)))
.build()
}
override fun activityInjector(): AndroidInjector<Activity> = androidInjector
}
但现在我在扩展默认应用程序(TestApplication)的地方使用不同的应用程序进行测试。在这个应用程序中,我构建了一个不同的注入器:
class TestApplication : MyApplication() {
override fun buildInjector() {
injectorComponent = DaggerMockComponent.builder().mockModule(MockModule(this)).build()
}
}
您将需要创建一个扩展 InjectorComponent 的 MockComponent 和一个提供您需要的所有模拟的 MockModule。
然后在你的测试中做:
@Before
fun setUp() {
val app = instrumentation.targetContext.applicationContext as TestApplication
(app.injectorComponent as MockComponent).inject(this)
}
效果很好!
我正在尝试使用 Dagger 2.11 的 Android 注入器注入模拟。
在使用 Android 注入之前,我曾经更改应用程序中的注入器 class 以便我可以注入模拟。像这样:
class EGOApplication : Application() {
lateinit var injectorComponent: InjectorComponent
override fun onCreate() {
super.onCreate()
injectorComponent = DaggerInjectorComponent.builder()
.appModule(AppModule(this))
.build()
}
在我的测试中,我曾经像这样更改 injectorComponent:
app.injectorComponent = DaggerMockComponent.builder()
.mockModule(MockModule(app))
.build()
然后我可以从 MockModule 中注入我的模拟。
但现在我正在使用本教程中的 Android 注射器:https://medium.com/@iammert/new-android-injector-with-dagger-2-part-1-8baa60152abe
嗯...现在我像这样注入我的依赖项:
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
}
所以我的方法不再有效了...如何从我的 MockModule 中创建 Dagger 注入器依赖项?
感谢任何帮助!
我找到了答案。
我在测试中更改了 injectorComponent...像这样:
@Inject
lateinit var someDependency: SomeDependency
val app = instrumentation.targetContext.applicationContext as MyApplication
app.injectorComponent = DaggerMockComponent.builder()
.mockModule(MockModule(app))
.build()
if (null == mockComponent) {
mockComponent = app.injectorComponent as MockComponent
mockComponent!!.inject(this)
}
我的申请大致是这样的:
open class MyApplication : Application(), HasActivityInjector {
@Inject
lateinit var androidInjector : DispatchingAndroidInjector<Activity>
lateinit var injectorComponent: InjectorComponent
override fun onCreate() {
super.onCreate()
buildInjector()
}
open fun buildInjector() {
injectorComponent = DaggerInjectorComponent.builder()
.dataModule(DataModule())
.appModule(AppModule(this))
.trackerModule(TrackerModule(this, FirebaseAnalytics.getInstance(this)))
.build()
}
override fun activityInjector(): AndroidInjector<Activity> = androidInjector
}
但现在我在扩展默认应用程序(TestApplication)的地方使用不同的应用程序进行测试。在这个应用程序中,我构建了一个不同的注入器:
class TestApplication : MyApplication() {
override fun buildInjector() {
injectorComponent = DaggerMockComponent.builder().mockModule(MockModule(this)).build()
}
}
您将需要创建一个扩展 InjectorComponent 的 MockComponent 和一个提供您需要的所有模拟的 MockModule。
然后在你的测试中做:
@Before
fun setUp() {
val app = instrumentation.targetContext.applicationContext as TestApplication
(app.injectorComponent as MockComponent).inject(this)
}
效果很好!