mco*_*mco 5 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()));
}
Run Code Online (Sandbox Code Playgroud)
在打电话的时候,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);
}
Run Code Online (Sandbox Code Playgroud)
任何帮助赞赏.谢谢!
编辑:使用runOnUiThread似乎工作.如果这是首选方式,我不知道.
@Test
public void testShouldShowErrorViewOnNetworkError() {
postsActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
postsActivity.showErrorMsg();
}
});
onView(withId(R.id.error_view)).check(matches(isDisplayed()));
}
Run Code Online (Sandbox Code Playgroud)
在你的Espresso测试中,你不应该直接调用你的方法Activity.您应该Espresso像真实用户一样使用UI进行交互.
runOnUiThread需要:在运行检测测试(例如Espresso测试)时,实际上涉及两个应用程序.首先是正在测试的应用程序和执行测试的应用程序.两者都使用不同的主线程.
如果PostsActivity#showErrorMsg从测试中调用,它将在测试应用程序线程中运行.但是只允许从应用程序UI线程中操纵Android中的视图.如果你真的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()));
}
Run Code Online (Sandbox Code Playgroud)