Espresso test Fail

2020-07-29 00:13发布

问题:

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.

回答1:

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:

if(activity!! is MainActivity){
    activity?.supportActionBar?.hide()
}

Or you should write the test for your MainActivity or where you use your fragment