やりたいこと
BottomNavigationViewを使っていてToolbar
自体はActivityのレイアウトにあります。
しかしオプションメニューはタブのFragment毎に異なるので、Fragmentの単体テストに含めたい。
ですがlaunchFragmentInContainer
で起動したFragmentでwithId(R.id.hoge_menu)
でアクセスすると、ビューが見つからないと言われる。
まぁそうか。
解決方法
少し発想を変えて、メニューのタップでなく、onOptionsItemSelected
の呼び出しをテストすることにした。
テストコードはこんな感じ。
val navController = mock(NavController::class.java)
val scenario = launchFragmentInContainer<TopFragment>(Bundle(), R.style.AppTheme)
scenario.onFragment {
Navigation.setViewNavController(it.view!!, navController)
it.onOptionsItemSelected(RoboMenuItem(R.id.hoge_menu))
verify(navController).navigate(TopFragmentDirections.actionTopFragmentToSubFragment())
}
RoboMenuItem(R.id.hoge_menu)
といのがRobolectricが用意しているMenuItem用のクラスを使用する。
これで無事に TopFragmentからオプションメニューをタップするとSubFragmentに移動することをテストすることができました。