Fil*_*mos 6 java android functional-testing android-fragments android-espresso
我的应用程序中有三个活动
我想使用espresso来测试一系列事件:单击登录活动上的登录按钮,打开主活动,然后单击主活动中的列表项,打开详细活动,然后单击详细信息中的另一个按钮活动.我开始创建这个简单的测试,以获得对listview的引用:
public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> {
public LoginActivityTest() {
super(LoginActivity.class);
}
@Override
public void setUp() throws Exception {
super.setUp();
getActivity();
}
public void testSequence() throws Exception {
// Login
onView(withId(R.id.button_log_in)).perform(click());
// Check if MainActivity is loaded
onView(withId(R.id.container)).check(matches(isDisplayed()));
// Check if Fragment is loaded
onView(withId(R.id.list)).check(matches(isDisplayed()));
}
}
Run Code Online (Sandbox Code Playgroud)
在mainActivity onCreate()方法中,我加载一个像这样的片段:
getFragmentManager().beginTransaction()
.add(R.id.container, mListFragment)
.commit();
Run Code Online (Sandbox Code Playgroud)
该ListFragment片段有一个列表(R.id.list),但仍是测试失败了NoMatchingViewException:
android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with id: com.tests.android.development:id/list
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
文档中的注释onView:
注意:视图必须是视图层次结构的一部分。如果将其呈现为 AdapterView(例如 ListView)的一部分,则情况可能并非如此。如果是这种情况,请先使用 Espresso.onData 加载视图。
要用于onData加载视图,您需要检查 ListView 中适配器的实例。换句话说,如果您的列表视图使用 Cursor 适配器,您可以尝试以下操作:
onData(allOf(is(instanceOf(Cursor.class)))).check(matches(isDisplayed()));
Run Code Online (Sandbox Code Playgroud)
值得注意的是,只有当您的列表视图包含至少一项时,上述内容才会通过。最好在某个项目存在的情况下进行一次测试,在某个项目不存在的情况下进行一次测试。
有关如何检查确实存在的数据的更多信息,请参阅此处。
有关如何检查适配器中不存在的数据的更多信息,请参阅此处。