Espresso 与找到的意图不符

问题描述 投票:0回答:1

我尝试在 Android Espresso 上使用

Matcher<Intent>
来模拟以下内容:

Intent { act=android.intent.action.CHOOSER (has extras) } handling packages:[[android, com.android.systemui]], extras:
[Bundle[{android.intent.extra.CHOSEN_COMPONENT_INTENT_SENDER=IntentSender{531e378: 
android.os.BinderProxy@5c9a51}, 
android.intent.extra.INTENT=Intent { act=android.intent.action.SEND typ=text/plain flg=0x1 clip={text/plain {T(148)}} (has extras) }, 
android.intent.extra.TITLE=}]]

Matcher<Intent> intentMatcher = allOf(hasExtra(Intent.EXTRA_INTENT,
                hasAction(Intent.ACTION_SEND)),
                hasType(MIME_TYPE_TEXT_PLAIN),
                hasExtra(Intent.EXTRA_TITLE, ""));

Matcher<Intent> expected = allOf(hasAction(Intent.ACTION_CHOOSER),
                hasExtra(Intent.EXTRA_CHOSEN_COMPONENT_INTENT_SENDER, intentMatcher));

intended(expected);

但是这是错误的,我错过了什么吗?

android android-intent android-espresso android-testing
1个回答
0
投票

尝试将

hasExtra("Key", Matcher<?>)
替换为
hasExtra(is("Key"), Matcher<?>)

Matcher<Intent> intentMatcher = allOf(hasExtra(is(Intent.EXTRA_INTENT),
                hasAction(Intent.ACTION_SEND)),
                hasType(MIME_TYPE_TEXT_PLAIN),
                hasExtra(Intent.EXTRA_TITLE, ""));

Matcher<Intent> expected = allOf(hasAction(Intent.ACTION_CHOOSER),
                hasExtra(is(Intent.EXTRA_CHOSEN_COMPONENT_INTENT_SENDER), intentMatcher));

intended(expected);

说明:

我依稀记得有类似的问题。我认为这与

hasExtra
有(太多)重载有关。

当你这样做时:

hasExtra("StringKey", intentMatcher)

您有理由认为 Expresso 会根据 extra 的值调用

intentMatcher.matches()
并确定它是否匹配。

然而,由于泛型的乐趣,以及前面提到的多重重载,

hasExtra(String, Matcher<Intent>)
解析为hasExtra(String, Matcher)——它解析为hasExtra(String, T)(我假设是因为
Matcher<Object>
Matcher<Intent>
并不明确相同,因此它更倾向于通用版本)。

这意味着 Espresso 正在检查 extra 的值是否确实是一个

Matcher<Intent>
对象。哎呀!

通过将其更改为

hasExtra(is("Key"), Matcher<?>)
,您可以强制 Espresso 使用 具有该签名的唯一重载,确保它按预期使用匹配器而不是作为文字对象。

© www.soinside.com 2019 - 2024. All rights reserved.