Итак, до 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?
Я придумал следующий подход для внедрения контекста в модули для 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
}
}
Это сделает контекст доступным в качестве параметра для провайдеров и поможет другим, когда они достигнут этой конкретной кирпичной стены.