【问题标题】:Android Espresso: Testing error message is shown?Android Espresso:显示测试错误消息?
【发布时间】:2016-06-20 05:42:02
【问题描述】:

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

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

【问题讨论】:

    标签: android unit-testing android-espresso


    【解决方案1】:

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

    为什么需要runOnUiThread

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

    如果您从测试中调用 PostsActivity#showErrorMsg,它会在测试应用线程中运行。但在 Android 中操作视图只能从应用程序 UI 线程中进行。如果你真的需要在测试中调用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()));
    }
    

    【讨论】:

    • 是的,我想做执行单击代码行,但是如何在单击按钮时触发网络错误以显示错误消息?这就是为什么我有点诉诸直接调用 Activity 的原因。
    • 您不应该在测试中使用真实网络。您的测试取决于网络资源的可用性。当依赖项(尤其是外部资源)被模拟或存根时,测试 ui 会更加稳定和容易。测试时用 mock/stub 替换网络层。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    相关资源
    最近更新 更多