Android Espresso:显示测试错误消息?
Android Espresso: Testing error message is shown?
我有一个测试应该在没有网络连接时测试错误消息的可见性,但我不知道如何让它显示?
@RunWith(AndroidJUnit4.class)
@LargeTest
public class PostsActivityTest {
@Rule
public final ActivityRule<PostsActivity> rule = new ActivityRule<>(PostsActivity.class);
PostsActivity postsActivity;
@Before
public void init() {
postsActivity = rule.get();
}
@Test
public void testShouldShowErrorViewOnNetworkError() {
postsActivity.showErrorMsg(); // doesn't work
onView(withId(R.id.error_view)).check(matches(isDisplayed()));
}
调用 postsActivity.showErrorMsg();
时出现崩溃 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
这是PostsActivity
中的showErrorMsg()
:
public void showErrorMsg() {
errorView.setVisibility(View.VISIBLE);
}
感谢任何帮助。谢谢!
编辑:使用 runOnUiThread
似乎有效。我不知道这是否是首选方式。
@Test
public void testShouldShowErrorViewOnNetworkError() {
postsActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
postsActivity.showErrorMsg();
}
});
onView(withId(R.id.error_view)).check(matches(isDisplayed()));
}
在您的 Espresso
测试中,您不应直接调用 Activity
的方法。您应该使用 Espresso
像真实用户一样与 UI 互动。
为什么需要runOnUiThread
:
当 运行 仪器测试(例如 Espresso
测试)时,实际上涉及两个应用程序。首先是正在测试的应用程序和执行测试的应用程序。两者都使用不同的主线程。
如果您从测试中调用 PostsActivity#showErrorMsg
,它在测试应用程序线程中是 运行。但是在 Android 中操作视图只允许从应用程序 UI 线程中进行。如果您真的必须从测试中调用 PostsActivity#showErrorMsg
,runOnUiThread
是正确的选择。
如何改进
因此,不要直接从测试中调用 PostsActivity#showErrorMsg
,而是使用 Espresso
到 click()
,例如在将为您调用该方法的 Button
上:
@Test
public void testShouldShowErrorViewOnNetworkError() {
onView(withId(R.id.post_button)).perform(click());
onView(withId(R.id.error_view)).check(matches(isDisplayed()));
}
我有一个测试应该在没有网络连接时测试错误消息的可见性,但我不知道如何让它显示?
@RunWith(AndroidJUnit4.class)
@LargeTest
public class PostsActivityTest {
@Rule
public final ActivityRule<PostsActivity> rule = new ActivityRule<>(PostsActivity.class);
PostsActivity postsActivity;
@Before
public void init() {
postsActivity = rule.get();
}
@Test
public void testShouldShowErrorViewOnNetworkError() {
postsActivity.showErrorMsg(); // doesn't work
onView(withId(R.id.error_view)).check(matches(isDisplayed()));
}
调用 postsActivity.showErrorMsg();
时出现崩溃 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
这是PostsActivity
中的showErrorMsg()
:
public void showErrorMsg() {
errorView.setVisibility(View.VISIBLE);
}
感谢任何帮助。谢谢!
编辑:使用 runOnUiThread
似乎有效。我不知道这是否是首选方式。
@Test
public void testShouldShowErrorViewOnNetworkError() {
postsActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
postsActivity.showErrorMsg();
}
});
onView(withId(R.id.error_view)).check(matches(isDisplayed()));
}
在您的 Espresso
测试中,您不应直接调用 Activity
的方法。您应该使用 Espresso
像真实用户一样与 UI 互动。
为什么需要runOnUiThread
:
当 运行 仪器测试(例如 Espresso
测试)时,实际上涉及两个应用程序。首先是正在测试的应用程序和执行测试的应用程序。两者都使用不同的主线程。
如果您从测试中调用 PostsActivity#showErrorMsg
,它在测试应用程序线程中是 运行。但是在 Android 中操作视图只允许从应用程序 UI 线程中进行。如果您真的必须从测试中调用 PostsActivity#showErrorMsg
,runOnUiThread
是正确的选择。
如何改进
因此,不要直接从测试中调用 PostsActivity#showErrorMsg
,而是使用 Espresso
到 click()
,例如在将为您调用该方法的 Button
上:
@Test
public void testShouldShowErrorViewOnNetworkError() {
onView(withId(R.id.post_button)).perform(click());
onView(withId(R.id.error_view)).check(matches(isDisplayed()));
}