Насколько я знаю, я не уверен, что мы можем объединить весь модуль, но мы можем издеваться над зависимостями, предоставляемыми модулем. Я достиг этого: мне нужно высмеять DataModule для тестирования пользовательского интерфейса, поэтому я создал этот TestDataModule
и предоставил mocks для зависимости.
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 Test runner и espresso, поэтому я использовал UIModule и Presentation Module, как есть (Can not макет, как хотелось бы проверить). Поэтому нужно издеваться над другими зависимостями, которые не являются частью этих тестов модуля UI, такими как DataRepository
. Вы можете добавить другие модули, такие как CacheModule и RemoteModules, как макеты, поскольку они не играют никакой роли в тестировании модулей UI.
Наконец, создайте DaggerTestApplicationComponent
в TestApplication
, как это,
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 будет генерировать требуемый граф зависимостей.
Примечание: требуется закройте все методы, вызванные издеваемыми зависимостями