我正在尝试使用Dagger 2.11的Android Injector注入模拟。
在使用Android Inject之前,我曾经在Application类中更改了注入器,因此我可以注入模拟。像这样:
class EGOApplication : Application() {
lateinit var injectorComponent: InjectorComponent
override fun onCreate() {
super.onCreate()
injectorComponent = DaggerInjectorComponent.builder()
.appModule(AppModule(this))
.build()
}
在我的测试中,我曾经像这样更改了喷射器组件:
app.injectorComponent = DaggerMockComponent.builder()
.mockModule(MockModule(app))
.build()
然后我可以从MockModule注入我的嘲笑。
但是现在我在本教程中使用Android Injector:https://medium.com/@iammert/new-android-injector-with-dagger-2-part-1-8baa60152abe
嗯......现在我注入了我的依赖项:
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
}
所以我的方法不再适用...... 如何从我的MockModule中制作Dagger注入器依赖项?
感谢任何帮助!
答案 0 :(得分:1)
我找到了答案。
我在测试中更改了injectComponent ......就像这样:
@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
}
但是现在我在我的测试中使用了不同的Application,我扩展了默认的Application(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)
}
它工作得很好!