У меня проблема с внедрением зависимостей Dagger 2. Я использую его в проекте Android, но в модуле java-библиотеки и в модульном тестировании.
ApiTestModule.kt
@Module
class ApiTestModule {
@Provides
@Named("testDatasource")
fun provideGithubTestDatasource(): GithubDatasourceImpl {
return GithubDatasourceImpl(Mockito.mock(GithubService::class.java))
}
}
TestComponent.kt
@Singleton
@Component(modules = [ApiTestModule::class])
interface TestComponent {
fun inject(test: GithubDatasourceImplTest)
}
GithubDatasourceImplTest.kt
class GithubDatasourceImplTest {
@set:[Inject Named("testDatasource")]
lateinit var datasource: GithubDatasourceImpl
@Before
fun setUp() {
val component = DaggerTestComponent.builder()
.apiTestModule(ApiTestModule())
.build()
component.inject(this)
}
@Test
fun test_create() {
checkNotNull(datasource)
}
}
модуль build.gradle
apply plugin: 'java-library'
apply plugin: 'kotlin'
apply plugin: 'kotlin-kapt'
kapt {
generateStubs = true
}
dependencies {
rootProject.ext.apiGithubDependencies.each {
add(it.configuration, it.dependency)
}
}
sourceCompatibility = "1.7"
targetCompatibility = "1.7"
Моя ошибка
ошибка:
[Dagger/MissingBinding] hr.thekarlo95.api.github.GithubDatasourceImpl cannot be provided without an @Inject constructor or an @Provides-annotated method.
public abstract void inject(@org.jetbrains.annotations.NotNull()
^
hr.thekarlo95.api.github.GithubDatasourceImpl is injected at
hr.thekarlo95.api.github.GithubDatasourceImplTest.setDatasource(p0)
hr.thekarlo95.api.github.GithubDatasourceImplTest is injected at
hr.thekarlo95.api.github.di.TestComponent.inject(hr.thekarlo95.api.github.GithubDatasourceImplTest)
Я не могу заставить это работать, и сообщение об ошибке действительно не помогает. Если я удалю fun inject(test: GithubDatasourceImplTest) из TestComponent, все будет компилироваться, но тогда я не смогу внедрить зависимости в свой модульный тест.
Нет. Это просто тест JUnit (4.12) в модуле java-библиотеки, поэтому в этом модуле нельзя делать ничего, связанного с Android. Думаю, я мог бы создать factory для своей службы api, но я хотел использовать Dagger во всем своем стеке приложений. Теоретически Dagger не является библиотекой Android, поэтому я не вижу причин не использовать его здесь. Я предполагаю, что создание его непосредственно для целей тестирования - это вариант. Я просто сбит с толку, что это не работает, хотя я сделал это способом, описанным в документации Daggers.
Конечно, вы также можете использовать Dagger с ванильной Java. В данном случае для этого просто нет причин. Вы создаете эту большую тестовую оснастку, чтобы внедрить имитацию, которую вы могли бы просто создать прямо здесь, в тесте.
Вы пробовали использовать @field вместо @set?




Это инструментальный тест в исходном наборе androidTest или вы действительно имеете в виду модульный тест в исходном наборе тестов? В последнем случае вы не должны использовать Dagger, а вместо этого просто создайте свои фиктивные объекты напрямую. Также не имеет смысла использовать Dagger в модуле библиотеки Java в проекте Android.