Dagger Inject для интеграционных тестов

Итак, до Dagger 2.11 я мог создавать TestComponent и модули, чтобы ключевые компоненты можно было вводить в интеграционные тесты. Это отлично подходит для тестов Api и объектов с высокими требованиями к компонентам.

Обычно у меня был бы такой код: -

class SpotifyApiTest  {

    lateinit var spotifyApi : SpotifyApi
        @Inject set
    lateinit var spotifyHelper : SpotifyIOHelper
        @Inject set

@Before
fun setup() {
    var context = InstrumentationRegistry.getInstrumentation().context

    val testAppComponent = DaggerSpotifyTestComponent.builder()
            .spotifyApiModule(SpotifyApiModule(context))
            .build()
    testAppComponent.inject(this)

}

@Test
  ......
}

N/B remember to add the following to your gradle build file

kaptAndroidTest "com.google.dagger:dagger-compiler:$daggerVersion"

Этот подход работает очень хорошо до Dagger 2.11, но после этой версии модули с параметризованными конструкторами не работают, предотвращая предоставление контекста, не говоря уже о приложении. Итак, как я могу использовать новую функциональность AndroidInjection () для интеграционных тестов, например, с Dagger 2.16?

1
0
303
1

Ответы 1

Я придумал следующий подход для внедрения контекста в модули для dagger 2.11+, так что это начало, я до сих пор не знаю, как обрабатывать приложение с точки зрения интеграционного теста.

@Singleton
@Component(modules = arrayOf(SpotifyAccountsModule::class,SpotifyApiModule::class))
interface SpotifyTestComponent {
    fun inject(test: SpotifyApiTest)
    fun inject(test: SpotifyAccountApiTest)

    @Component.Builder
    interface Builder {
        @BindsInstance
        fun create(context: Context): Builder
        fun build(): SpotifyTestComponent
    }
}

Это сделает контекст доступным в качестве параметра для провайдеров и поможет другим, когда они достигнут этой конкретной кирпичной стены.

Другие вопросы по теме