如何将 MockModule 注入 DaggerAppComponent?
How to inject a MockModule into DaggerAppComponent?
我使用Dagger Android有一段时间了,现在想注入一个MockModule做测试用,不知道怎么弄。我在一些帖子上看到他们称之为:
DaggerAppComponent.builder()
.dataModule(myMockModule)
.create(this).inject(this)
但是我有这样的配置:
@Singleton
@Component(modules = [
AndroidSupportInjectionModule::class,
ActivitiesBuilderModule::class,
AppModule::class,
DataModule::class
])
internal interface AppComponent : AndroidInjector<CbvApplication> {
@Component.Builder
abstract class Builder : AndroidInjector.Builder<CbvApplication>()
}
并且当我创建应用程序时,DaggerAppComponent.Builder
没有为各个模块提供 setters
。这很好,因为在应用程序代码中我不必担心它,但在测试时,我想通过 mockComponents / modules 注入我的模拟对象。
谁能给我指出正确的方向???
据我所知,我不确定我们是否可以一起模拟整个模块,但我们可以 模拟 module[=41] 提供的依赖项 =].
我已经实现了这一点,我需要模拟 DataModule 进行 UI 测试,所以我创建了这个 TestDataModule
并为依赖项提供了模拟。
import com.nhaarman.mockito_kotlin.mock
import dagger.Module
import dagger.Provides
import javax.inject.Singleton
@Module
class TestDataModule {
@Provides
@Singleton
fun providesDataRepository(): DataRepository {
return mock()
}
}
这里是TestApplicationModule
@Module
abstract class TestApplicationModule {
@Binds
abstract fun bindContext(application: Application): Context
}
并创建了 TestApplicationComponent
,它将采用所需的模块
@Singleton
@Component(modules = [
(AndroidSupportInjectionModule::class),
(TestApplicationModule::class),
(UIModule::class),
(PresentationModule::class),
(TestDataModule::class)])
interface TestApplicationComponent {
// Here you can add additional direct mock
// classes to access them directly from component reference
fun dataRepository(): DataRepository
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): TestApplicationComponent.Builder
fun build(): TestApplicationComponent
}
fun inject(app: TestAppplication)
}
我必须使用 Android JUnit 测试运行程序和浓缩咖啡来测试 UI,所以我按原样使用了 UI 模块和演示模块(无法模拟测试)。因此必须模拟不属于 UI 单元测试的其他依赖项,例如 DataRepository
您可以添加其他模块,例如 CacheModule 和 RemoteModules 作为模拟,因为它们在 UI 单元测试中不起任何作用。
最后,像这样在TestApplication
中创建DaggerTestApplicationComponent
,
class TestApplication : Application(), HasActivityInjector {
@Inject lateinit var activityInjector: DispatchingAndroidInjector<Activity>
private lateinit var appComponent: TestApplicationComponent
override fun onCreate() {
super.onCreate()
appComponent = DaggerTestApplicationComponent.builder()
.application(this)
.build()
appComponent.inject(this)
}
override fun activityInjector(): AndroidInjector<Activity> = activityInjector
}
现在 DaggerTestApplicationComponent 将生成所需的依赖关系图。
注意: 需要对模拟依赖项上调用的所有方法进行存根
我使用Dagger Android有一段时间了,现在想注入一个MockModule做测试用,不知道怎么弄。我在一些帖子上看到他们称之为:
DaggerAppComponent.builder()
.dataModule(myMockModule)
.create(this).inject(this)
但是我有这样的配置:
@Singleton
@Component(modules = [
AndroidSupportInjectionModule::class,
ActivitiesBuilderModule::class,
AppModule::class,
DataModule::class
])
internal interface AppComponent : AndroidInjector<CbvApplication> {
@Component.Builder
abstract class Builder : AndroidInjector.Builder<CbvApplication>()
}
并且当我创建应用程序时,DaggerAppComponent.Builder
没有为各个模块提供 setters
。这很好,因为在应用程序代码中我不必担心它,但在测试时,我想通过 mockComponents / modules 注入我的模拟对象。
谁能给我指出正确的方向???
据我所知,我不确定我们是否可以一起模拟整个模块,但我们可以 模拟 module[=41] 提供的依赖项 =].
我已经实现了这一点,我需要模拟 DataModule 进行 UI 测试,所以我创建了这个 TestDataModule
并为依赖项提供了模拟。
import com.nhaarman.mockito_kotlin.mock
import dagger.Module
import dagger.Provides
import javax.inject.Singleton
@Module
class TestDataModule {
@Provides
@Singleton
fun providesDataRepository(): DataRepository {
return mock()
}
}
这里是TestApplicationModule
@Module
abstract class TestApplicationModule {
@Binds
abstract fun bindContext(application: Application): Context
}
并创建了 TestApplicationComponent
,它将采用所需的模块
@Singleton
@Component(modules = [
(AndroidSupportInjectionModule::class),
(TestApplicationModule::class),
(UIModule::class),
(PresentationModule::class),
(TestDataModule::class)])
interface TestApplicationComponent {
// Here you can add additional direct mock
// classes to access them directly from component reference
fun dataRepository(): DataRepository
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): TestApplicationComponent.Builder
fun build(): TestApplicationComponent
}
fun inject(app: TestAppplication)
}
我必须使用 Android JUnit 测试运行程序和浓缩咖啡来测试 UI,所以我按原样使用了 UI 模块和演示模块(无法模拟测试)。因此必须模拟不属于 UI 单元测试的其他依赖项,例如 DataRepository
您可以添加其他模块,例如 CacheModule 和 RemoteModules 作为模拟,因为它们在 UI 单元测试中不起任何作用。
最后,像这样在TestApplication
中创建DaggerTestApplicationComponent
,
class TestApplication : Application(), HasActivityInjector {
@Inject lateinit var activityInjector: DispatchingAndroidInjector<Activity>
private lateinit var appComponent: TestApplicationComponent
override fun onCreate() {
super.onCreate()
appComponent = DaggerTestApplicationComponent.builder()
.application(this)
.build()
appComponent.inject(this)
}
override fun activityInjector(): AndroidInjector<Activity> = activityInjector
}
现在 DaggerTestApplicationComponent 将生成所需的依赖关系图。
注意: 需要对模拟依赖项上调用的所有方法进行存根