Android Espresso:显示测试错误消息?

时间:2016-06-20 05:42:03

标签: android unit-testing android-espresso

我有一个测试,当没有网络连接时应该测试错误信息的可见性,但我不知道如何让它显示?

@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.

的崩溃

这是showErrorMsg()中的PostsActivity

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

1 个答案:

答案 0 :(得分:8)

Espresso测试中,您不应直接调用Activity的方法。您应该像真实用户一样使用Espresso与UI进行交互。

为什么需要runOnUiThread

运行检测测试(例如Espresso测试)时,实际上涉及两个应用程序。首先是正在测试的应用程序和执行测试的应用程序。两者都使用不同的主线程。

如果您从测试中调用PostsActivity#showErrorMsg,它将在测试应用程序主题中运行。但是只允许从应用程序UI线程中操纵Android中的视图。如果您真的需要从测试中拨打PostsActivity#showErrorMsgrunOnUiThread是正确的选择。

如何改善

因此,不要直接从测试中调用PostsActivity#showErrorMsg,而是使用Espressoclick(),例如在Button上为您调用该方法:

@Test
public void testShouldShowErrorViewOnNetworkError() {
    onView(withId(R.id.post_button)).perform(click());
    onView(withId(R.id.error_view)).check(matches(isDisplayed()));
}