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));
}