Я пытаюсь лучше узнать фреймворк эспрессо для тестирования в 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)
}