我试图编写一个简单的测试,只需点击主要活动中的MenuItem:
public class doTest extends ActivityInstrumentationTestCase2<doActivity> {
public doTest() {
super(doActivity.class);
}
@Override
public void setUp() throws Exception {
super.setUp();
startActivity();
}
private void startActivity() {
Intent intent = new Intent();
setActivityIntent(intent);
getActivity();
}
public void testOne() {
Espresso.openContextualActionModeOverflowMenu();
onView(withId(R.id.create_new)).perform(ViewActions.click());
}
}
测试失败,并且#34; NoMatchingViewException&#34;。如果我将onView行更改为:
onView(withText("Add new")).perform(ViewActions.click());
以下是活动的菜单xml:
<item
android:id="@+id/create_new"
android:title="Add new"
tools:ignore="HardcodedText">
</item>
测试工作正常。为什么matcher withText会找到视图,而匹配器却找不到?
答案 0 :(得分:12)
是的,这就是Espresso的工作原理。这里的问题是,在Android中,表示菜单项的View没有菜单项的ID。所以onView(withId(X))
无法找到视图。我没有比仅使用withText()
更好的建议。如果您有多个具有相同文本的视图,则使用层次结构进行区分工作。
答案 1 :(得分:3)
haffax的回答是正确的。菜单项和为菜单生成的视图具有不同的ID。在这种情况下,使用withText
是最着名的做法。
为了避免在测试中对“添加新”这样的文本进行硬编码,我建议使用String引用。如,
<item
android:id="@+id/create_new"
android:title="@string/action_create_new"
tools:ignore="HardcodedText"
/>