Dagger 2 - не может быть предоставлен без конструктора @Inject или метода с аннотацией @ Provides

У меня проблема с внедрением зависимостей 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, все будет компилироваться, но тогда я не смогу внедрить зависимости в свой модульный тест.

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

AutonomousApps 07.07.2018 04:05

Нет. Это просто тест JUnit (4.12) в модуле java-библиотеки, поэтому в этом модуле нельзя делать ничего, связанного с Android. Думаю, я мог бы создать factory для своей службы api, но я хотел использовать Dagger во всем своем стеке приложений. Теоретически Dagger не является библиотекой Android, поэтому я не вижу причин не использовать его здесь. Я предполагаю, что создание его непосредственно для целей тестирования - это вариант. Я просто сбит с толку, что это не работает, хотя я сделал это способом, описанным в документации Daggers.

TheKarlo95 07.07.2018 07:25

Конечно, вы также можете использовать Dagger с ванильной Java. В данном случае для этого просто нет причин. Вы создаете эту большую тестовую оснастку, чтобы внедрить имитацию, которую вы могли бы просто создать прямо здесь, в тесте.

AutonomousApps 07.07.2018 07:43

Вы пробовали использовать @field вместо @set?

tompee 13.07.2018 11:13
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
326
0

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