如何在Android中测试基于浓缩咖啡的意图?

如何在Android中测试基于浓缩咖啡的意图?,android,android-intent,android-espresso,Android,Android Intent,Android Espresso,我想测试我从活动A发送到活动B的意图。这里有一些示例,还有 不幸的是,我没能把它投入工作。我想在我的第一个活动中测试以下方法 private void searchForDropOff() { this.startActivityForResult(PoiActivity.newIntent(this, PlacesAPIRequest.PARAM_SEARCH_TYPE_DESTINATION, this.mBooking

我想测试我从活动A发送到活动B的意图。这里有一些示例,还有

不幸的是,我没能把它投入工作。我想在我的第一个活动中测试以下方法

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);
    }
根据我的参考资料,这是我的测试代码:

@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")));
    }
}
@RunWith(AndroidJUnit4.class)
公共类首次活动测试
{
@统治
public final IntentsTestRule mRule=新的IntentsTestRule(FirstActivityTest.class);
@以前
公共无效存根外部元素()
{
//默认情况下,浓缩咖啡意向书不会存根任何意向书。存根前需要设置
//每次测试运行。在这种情况下,所有外部意图都将被阻止。
意图(不是(isInternal()).respondWith(新的Instrumentation.ActivityResult(Activity.RESULT_OK,null));
}
@试验
公共作废单击下拉框()
{
//单击下拉框,将显示POI活动
打开视图(带id(R.id.booking\u drop\u off\u layout))。执行(单击());
//验证是否已随软件包发送拨号程序的意向。
//可以将意向API看作与Mockito的verify等效的API。
预期(全部)(
hasExtra(poActivity.EXTRA搜索类型,PlacesAPIRequest.PARAM搜索类型目的地),
toPackage(“com.XXX.passenger.poi.poi活动”);
}
}
我在日志中得到的信息:

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}]])
android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError:想要匹配1个意图。实际上匹配了0个意图。
IntentMatcher:(has extras:has bundle with:key:is“addressType”值:is并解析为:com.xxx.passenger.poi.poi活动)
匹配意图:[]
记录的意图:
-意向{cmp=com.xxx.passenger/com.xxx.passenger.poi.poi活动(有额外服务)}处理包裹:[[com.xxx.passenger]],额外服务:[捆绑[{referencePoint=lat/lng:(1.3650683103.8313499),地址类型=2}]]

天哪,两天后我终于找到了解决办法。 我使用了
hasComponent
而不是
toPackage
,我的测试通过了。 我不确定我的结论是否正确,但对于检查应用程序的活动(组件),我们应该使用
hasComponent
方法

所以我的变化是:

intended(allOf(
                hasExtra(PoiActivity.EXTRA_SEARCH_TYPE, PlacesAPIRequest.PARAM_SEARCH_TYPE_DESTINATION),
                hasComponent("com.XXX.passenger.poi.PoiActivity")));
是的,
package
(又称
applicationId
)是一组
组件(即清单中声明的内容)。