I am doing some Espresso testing in Android. The test is failing with this error:
java.lang.ClassCastException: androidx.fragment.app.testing.FragmentScenario$EmptyFragmentActivity cannot be cast to com.stavro_xhardha.pockettreasure.MainActivity
This is my test method:
@Test
fun toolbarTitle_shouldContainCorrectInput() {
val mockNavController = mock(NavController::class.java)
val fragmentScenario = launchFragmentInContainer<SetupFragment>()
fragmentScenario.onFragment {
Navigation.setViewNavController(it.view!! , mockNavController)
}
onView(withId(R.id.toolbar)).check(matches(withText("Pick your country")))
}
But the error doesn't come from the Test class but from my Fragment under test. The crash is executed in this line of code:
override fun onStart() {
super.onStart()
(activity!! as MainActivity).supportActionBar?.hide() //here
}
What I don't get here is that I face no error when I run the app normally without test.
Here is the full answer. So, let's repeat about
launchFragmentInContainer
. All that this functionality does it take the given fragment and launch it inside of an internal EmptyFragmentActivity class — placing the fragment inside of the root view container. So, it should be used to check fragment only, which doesn't depends from it's parent activity. In your case, you try to hide an action bar inside the fragment you're testing. But in test your fragment will not be launched in MainActivity. So if you want to check only the fragment, instead of(activity!! as MainActivity).supportActionBar?.hide()
you'll better need to write something like this:Or you should write the test for your MainActivity or where you use your fragment