首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在android espresso中查看吐司消息

在android espresso中查看吐司消息
EN

Stack Overflow用户
提问于 2015-02-08 12:28:54
回答 9查看 45.2K关注 0票数 82

有人知道如何在android espresso中测试Toast消息的外观吗?在robotium中,这很简单&我用过,但开始在espresso工作,但没有得到确切的命令。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2015-02-19 20:36:47

下面这个略长的声明适用于我:

代码语言:javascript
复制
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.RootMatchers.withDecorView;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
....
onView(withText(R.string.TOAST_STRING)).inRoot(withDecorView(not(is(getActivity().getWindow().getDecorView())))).check(matches(isDisplayed()));
票数 124
EN

Stack Overflow用户

发布于 2015-10-28 18:00:50

公认的答案是一个很好的答案,但对我来说不起作用。所以我搜索了一下,找到了this blog article。这给了我一个如何做的想法,我更新了上面的解决方案。

首先,我实现了ToastMatcher:

代码语言:javascript
复制
import android.os.IBinder;
import android.support.test.espresso.Root;
import android.view.WindowManager;
import org.hamcrest.Description;
import org.hamcrest.TypeSafeMatcher;

public class ToastMatcher extends TypeSafeMatcher<Root> {

  @Override
  public void describeTo(Description description) {
    description.appendText("is toast");
  }

  @Override
  public boolean matchesSafely(Root root) {
    int type = root.getWindowLayoutParams().get().type;
    if (type == WindowManager.LayoutParams.TYPE_TOAST) {
        IBinder windowToken = root.getDecorView().getWindowToken();
        IBinder appToken = root.getDecorView().getApplicationWindowToken();
        if (windowToken == appToken) {
            // windowToken == appToken means this window isn't contained by any other windows.
            // if it was a window for an activity, it would have TYPE_BASE_APPLICATION.
            return true;
        }
    }
    return false;
  }

}

然后我像这样实现了我的check方法:

代码语言:javascript
复制
public void isToastMessageDisplayed(int textId) {
    onView(withText(textId)).inRoot(MobileViewMatchers.isToast()).check(matches(isDisplayed()));
}

MobileViewMatchers是一个用于访问匹配器的容器。在那里我定义了静态方法isToast()

代码语言:javascript
复制
public static Matcher<Root> isToast() {
    return new ToastMatcher();
}

这对我来说就像是一种魔力。

票数 51
EN

Stack Overflow用户

发布于 2016-11-23 12:32:42

首先确保导入:

代码语言:javascript
复制
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static android.support.test.espresso.matcher.RootMatchers.withDecorView;
import static android.support.test.espresso.assertion.ViewAssertions.matches;

在你的类中,你可能有这样一条规则:

代码语言:javascript
复制
@Rule
public ActivityTestRule<MyNameActivity> activityTestRule =
            new ActivityTestRule<>(MyNameActivity.class);

在你的测试中:

代码语言:javascript
复制
MyNameActivity activity = activityTestRule.getActivity();
onView(withText(R.string.toast_text)).
    inRoot(withDecorView(not(is(activity.getWindow().getDecorView())))).
    check(matches(isDisplayed()));

这对我来说很有效,而且非常容易使用。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28390574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档