How to test Intent based on Espresso in Android?

2019-06-01 04:07发布

问题:

I want to test the Intent I'm sending from Activity A to Activity B. There are samples for that, android-testing and espresso.intent.Intents.

Unfortunately, I couldn't get it into work :( I want to test following method in my first Activity.

private void searchForDropOff()
    {
        this.startActivityForResult(PoiActivity.newIntent(this, PlacesAPIRequest.PARAM_SEARCH_TYPE_DESTINATION,
                        this.mBooking.getPickUp() != null ? this.getPickUp().getSafeLatLng() : this.mReferenceLatLng),
                        PlacesAPIRequest.PARAM_SEARCH_TYPE_DESTINATION);
    }

So, according to my references this is my test code:

@RunWith(AndroidJUnit4.class)
public class FirstActivityTest
{
    @Rule
    public final IntentsTestRule<FirstActivityTest> mRule = new IntentsTestRule<>(FirstActivityTest.class);

    @Before
    public void stubAllExternalIntents()
    {
        // By default Espresso Intents does not stub any Intents. Stubbing needs to be setup before
        // every test run. In this case all external Intents will be blocked.
        intending(not(isInternal())).respondWith(new Instrumentation.ActivityResult(Activity.RESULT_OK, null));
    }

    @Test
    public void click_drop_off_box()
    {
        // Click drop-off box, POI activity displays
        onView(withId(R.id.booking_drop_off_layout)).perform(click());

        // Verify that an intent to the dialer was sent with the package.
        // Think of Intents intended API as the equivalent to Mockito's verify.
        intended(allOf(
                hasExtra(PoiActivity.EXTRA_SEARCH_TYPE, PlacesAPIRequest.PARAM_SEARCH_TYPE_DESTINATION),
                toPackage("com.XXX.passenger.poi.PoiActivity")));
    }
}

What I'm getting in Log:

android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: Wanted to match 1 intents. Actually matched 0 intents.

IntentMatcher: (has extras: has bundle with: key: is "addressType" value: is <2> and resolvesTo: com.xxx.passenger.poi.PoiActivity)

Matched intents:[]

Recorded intents:
-Intent { cmp=com.xxx.passenger/com.xxx.passenger.poi.PoiActivity (has extras) } handling packages:[[com.xxx.passenger]], extras:[Bundle[{referencePoint=lat/lng: (1.3650683,103.8313499), addressType=2}]])

I'm confused a lot :( any idea would be appreciated. Thanks.

回答1:

oh man, finally after two days I found the solution. I Used hasComponent instead of toPackage and my test passed. I'm not sure my conclusion is right but seems for checking our application's activities (Components) we should use hasComponent method.

So my change is:

intended(allOf(
                hasExtra(PoiActivity.EXTRA_SEARCH_TYPE, PlacesAPIRequest.PARAM_SEARCH_TYPE_DESTINATION),
                hasComponent("com.XXX.passenger.poi.PoiActivity")));