我试图更好地了解espresso框架,以便在android中进行测试,但是尝试模仿演示者时遇到了问题。
我的应用程序使用带有Dagger 2的MVP架构。我有一个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
}
Actual ActivityBindingModule类:
@Module
abstract class ActivityBindingModule {
@ActivityScope
@ContributesAndroidInjector(modules = arrayOf(
FragmentModule::class))
abstract fun provideMainActivityInjector(): MainActivity
}
非常感谢您对如何解决此问题的任何见解!一整天都在花时间!
我也已经看过:
How to write an Android UI test where the contents of views are determined at runtime?
Espresso Injecting a Mock Presenter Object
Dagger: IllegalArgumentException: No injector factory bound for Class
java.lang.IllegalArgumentException: No injector factory bound for Class<MyActivity_>
Dagger2: no injector factory bound for fragment
Android dagger: No injector factory bound
No injector was found for fragment dagger 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)
}