Лекционный класс для тестирования фрагментов - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь лучше узнать фреймворк эспрессо для тестирования в Android, однако у меня возникла проблема с попыткой издеваться над моим докладчиком.

Мое приложение использует архитектуру MVP с Dagger 2. У меня есть MainActivity с нижней панелью навигации и 3 фрагментами.

Есть ли способ издеваться над моим докладчиком и вставлять его во фрагмент?

Я создал класс фиктивного приложения и модуль фиктивного фрагмента, который предоставляет имитатора, но я продолжаю получать:

No injector factory bound for Class<MainFragment>

Мой класс тестового приложения:

open class ApplicationTest : Application() {
    override val component: AppComponent by lazy {
        DaggerAppComponentTest.builder()
                .application(this)
                .build()
    }
}

MockedActivityBindingModule:

@Module
abstract class MockedActivityBindingModule {
    @ActivityScope
    @ContributesAndroidInjector(modules = arrayOf(
            MockedFragmentModule::class))
    abstract fun provideMainActivityInjector(): MainActivity
}

Насмешливый фрагмент:

@Module
object MockedFragmentModule {

    @JvmStatic
    @FragmentScope
    @Provides
    fun provideMainFragmentPresenter(): MainFragmentContract.Presenter {
        val mockedPresenter = mock<MainFragmentPresenter>()
        return mockedPresenter
    }

    @JvmStatic
    @FragmentScope
    @Provides
    fun mainFragment(): MainFragment {
        return MainFragment.newInstance()
    }
}

Фактический фрагмент Модуль класса:

@Module
internal abstract class FragmentModule {
    @FragmentScope
    @Binds
    abstract fun provideMainFragmentPresenter(mainFragmentPresenter: MainFragmentContract): MainFragmentContract.Presenter

    @FragmentScope
    @ContributesAndroidInjector
    abstract fun mainFragment(): MainFragment
}

Фактический класс ActivityBindingModule:

@Module
abstract class ActivityBindingModule {
    @ActivityScope
    @ContributesAndroidInjector(modules = arrayOf(
            FragmentModule::class))
    abstract fun provideMainActivityInjector(): MainActivity
}

Любое понимание того, как это исправить, очень ценится! Потратил на это целый день!

Я также уже посмотрел:

Как написать тест пользовательского интерфейса Android, в котором содержимое представлений определяется во время выполнения?

Эспрессо, вводящее объект "Образец презентатора"

Кинжал: IllegalArgumentException: фабрика форсунок не привязана к классу

java.lang.IllegalArgumentException: фабрика инжекторов не привязана к классу

Dagger2: фабрика инжекторов не привязана к фрагменту

Кинжал Android: заводская привязка не ограничена

Не найден инжектор для осколочного кинжала 2.11

Спасибо!

Редактировать Я также добавил тестовый пример здесь:

@Before
    override fun setup() {
        super.setup()
        // Getting error when the fragment comes to view
Espresso.onView(ViewMatchers.withId(R.id.orders)).perform(ViewActions.click())
    }

    @Test
    fun onClickOrderListItemDisplaysOrderDetailView() {
        val recyclerView = activityTestRule.activity.findViewById(R.id.ordersList) as RecyclerView
            assertNotSame(0, recyclerView.adapter?.itemCount)
    }

StackTrace:

Caused by: java.lang.IllegalArgumentException: No injector factory bound for Class<MainFragment>
at dagger.android.DispatchingAndroidInjector.inject(DispatchingAndroidInjector.java:106)
at dagger.android.support.AndroidSupportInjection.inject(AndroidSupportInjection.java:71)
at MainFragment.onAttach(MainFragment.kt:173)

MainFragment.kt

    override fun onAttach(context: Context?) {
        AndroidSupportInjection.inject(this) //line where I'm getting the exception
        super.onAttach(context)
    }
...