用于片段仪器测试的模拟演示者类

时间:2019-04-19 11:10:00

标签: android android-espresso dagger-2 android-instrumentation

我试图更好地了解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)
    }

0 个答案:

没有答案