Android 明确仪器测试之间的意图

Android 明确仪器测试之间的意图,android,android-intent,android-espresso,Android,Android Intent,Android Espresso,我的一个浓缩咖啡测试显然失败了,因为前一个测试触发的广播意图在随后的测试中部分到达。此时,应用程序处于不一致状态,缺少一些意图处理程序预期的SharedReference 在开始浓缩咖啡测试之前,有没有办法确保所有等待的意向都已被处理或取消?我认为没有办法清除已经发出的意向。不过,您可以通过调整“以前的测试”来绕过此问题 如果你想充分利用浓缩咖啡,你必须尽可能缩小你的测试范围。因此,与其广播意图并验证接下来会发生什么,不如试着打断你的意图 使用IntentsTestRule而不是Activity

我的一个浓缩咖啡测试显然失败了,因为前一个测试触发的广播意图在随后的测试中部分到达。此时,应用程序处于不一致状态,缺少一些意图处理程序预期的
SharedReference


在开始浓缩咖啡测试之前,有没有办法确保所有等待的意向都已被处理或取消?

我认为没有办法清除已经发出的意向。不过,您可以通过调整“以前的测试”来绕过此问题

如果你想充分利用浓缩咖啡,你必须尽可能缩小你的测试范围。因此,与其广播意图并验证接下来会发生什么,不如试着打断你的意图

使用
IntentsTestRule
而不是
ActivityTestRule
,并使用以下代码删除所有内部意图(有时甚至是外部意图):

intending(isInternal()).respondWith(new Instrumentation.ActivityResult(Activity.RESULT_OK, null));
现在,在您的“上一次测试”中,检查是否使用以下方式广播了正确的意图:

designed(hasComponent(“com.example.something.SomeActivity”)

通过这种方式,您可以测试您的功能,而无需实际广播任何意图。我总是存根我的内部和外部意图,并验证在所有测试中是否触发了正确的意图。这样,下一个活动就不会启动,我的浓缩咖啡测试也会更快更稳定。始终确保只测试您想要测试的内容,并保持范围非常小


阅读更多:

我在测试两个意图时遇到同样的问题, 一个用于共享文本,另一个用于共享音频。 我在两种意图之间打了个电话,设法做到了这一点

Intents.init()
//
Intents.release()
我不知道这是不是正确的方法,但我正在研究这个问题

假设我必须用action CHOOSER检查两个意图。 即使我的意图是ACTION\u SEND,我的代码中也有一个选择器来发送意图

    Intents.init()
    testIntent1
    Intents.release()

    Intents.init()
    testIntent2
    Intents.release()

testIntent1(){
Matcher expectedIntent=getIntentMatcherChooser();
String textInET=“共享此文本”;
替换文本关闭键盘(R.id.et_main,文本);
openDrawerClickItem(R.id.nav\u项目\u共享\u文本);
预期的(预期的);
}   
getIntentMatcherChooser(){
Matcher expectedIntent=allOf(hasAction(Intent.ACTION\u CHOOSER));
意图(预期)。响应(新的检测。活动结果(0,null));
}  

谢谢,回答得很好,如果我想更具体地测试意图,它看起来会非常有用。但在我的例子中,意图是在UI元素的点击处理程序中激发的。我不想测试意图本身,但它们反过来会触发UI更新。我会考虑代码是否可以更好地隔离。即使在这种情况下,我也建议您将意图存根。如果“广播的意图”是
单击处理程序的副作用,那么可以安全地存根意图并仍然验证UI更新。如果您的
广播意图
是导致UI更新的原因,则需要将测试分成两部分。第一个测试用例:如果单击
单击处理程序
激发所需的意图,则进行测试。第二个测试用例:使用
广播意图启动活动
,并检查UI更新。
testIntent1() {
    Matcher<Intent> expectedIntent = getIntentMatcherChooser();
    String textInET = "share this text";

    replaceTextCloseKeyboard(R.id.et_main, text);
    openDrawerClickItem(R.id.nav_item_share_text);

    intended(expectedIntent);
}   

getIntentMatcherChooser(){
    Matcher<Intent> expectedIntent = allOf(hasAction(Intent.ACTION_CHOOSER));
    intending(expectedIntent).respondWith(new Instrumentation.ActivityResult(0, null));
}