gpt4 book ai didi

安卓 Espresso : Testing error message is shown?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:12:41 25 4
gpt4 key购买 nike

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

@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: 只有创建 View 层次结构的原始线程可以触及它的 View 。

这是 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 中操作 View 只允许从应用程序 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()));
}

关于安卓 Espresso : Testing error message is shown?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37915270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com