web-dev-qa-db-ja.com

Android Espresso:1つのアクティビティを複数のフラグメントアーキテクチャにフォローするときに特定のフラグメントをテストする方法

私のアプリは、多くのActivityに対して1つのFragmentsで構成されています。

Espressoを使用してFragmentsのUIをテストしたいと思います。しかし、私は問題に遭遇しました。

FragmentActivityに追加されていないonCreateをテストするにはどうすればよいですか。私がFragmentsで見たすべての例には、Fragmentに追加されたonCreateが含まれます。それでは、エスプレッソに特定のFragmentに行き、そこから開始するように指示するにはどうすればよいですか?

ありがとう

19
Ersen Osman

ナビゲーションアーキテクチャコンポーネントを使用している場合、テストの開始時に(適切な引数を使用して)ターゲットフラグメントにディープリンクすることにより、各フラグメントを即座にテストできます。

@Rule
@JvmField
var activityRule = ActivityTestRule(MainActivity::class.Java)

protected fun launchFragment(destinationId: Int,
                             argBundle: Bundle? = null) {
    val launchFragmentIntent = buildLaunchFragmentIntent(destinationId, argBundle)
    activityRule.launchActivity(launchFragmentIntent)
}

private fun buildLaunchFragmentIntent(destinationId: Int, argBundle: Bundle?): Intent =
        NavDeepLinkBuilder(InstrumentationRegistry.getInstrumentation().targetContext)
                .setGraph(R.navigation.navigation)
                .setComponentName(MainActivity::class.Java)
                .setDestination(destinationId)
                .setArguments(argBundle)
                .createTaskStackBuilder().intents[0]

destinationIdは、ナビゲーショングラフのフラグメントの宛先IDです。フラグメントを起動する準備ができたら実行される呼び出しの例を次に示します。

launchFragment(R.id.target_fragment, targetBundle())

private fun targetBundle(): Bundle? {
    val bundle = Bundle()
    bundle.putString(ARGUMENT_ID, "Argument needed by fragment")
    return bundle
}

また、ここで詳細に回答しました: https://stackoverflow.com/a/55203154/2125351

2
Sean Blahovici