27

我想要在 LinearLayout 的 textview 中显示文本字符串。浓缩咖啡能做到吗?如果没有,是否有其他方法可以做到这一点,或者我可以在 espresso 测试用例中使用 android api 吗?我正在使用 API 17 18 或更新的 espresso 1.1(它应该是最新的。)。我对此一无所知。谢谢。

4

2 回答 2

53

基本思想是使用具有内部的方法ViewAction来检索其 perform 方法中的文本。匿名类只能访问 final 字段,所以我们不能让它设置一个局部变量getText(),而是使用一个 String 的数组来从ViewAction.

    String getText(final Matcher<View> matcher) {
        final String[] stringHolder = { null };
        onView(matcher).perform(new ViewAction() {
            @Override
            public Matcher<View> getConstraints() {
                return isAssignableFrom(TextView.class);
            }
    
            @Override
            public String getDescription() {
                return "getting text from a TextView";
            }
    
            @Override
            public void perform(UiController uiController, View view) {
                TextView tv = (TextView)view; //Save, because of check in getConstraints()
                stringHolder[0] = tv.getText().toString();
            }
        });
        return stringHolder[0];
    }

注意:这种视图数据检索器应谨慎使用。如果你经常发现自己在编写这种方法,那么很有可能你从一开始就做错了什么。也永远不要在ViewAssertionor之外访问视图ViewAction,因为只有在那里才能确保交互是安全的,因为它是从 UI 线程运行的,并且在执行之前检查它,没有其他交互干预。

于 2014-05-05T08:01:07.957 回答
7

如果你想用另一个文本检查文本值,你可以创建 Matcher。您可以查看我的代码来创建自己的方法:

 public static Matcher<View> checkConversion(final float value){
    return new TypeSafeMatcher<View>() {

        @Override
        protected boolean matchesSafely(View item) {
            if(!(item instanceof TextView)) return false;

            float convertedValue = Float.valueOf(((TextView) item).getText().toString());
            float delta = Math.abs(convertedValue - value);

            return delta < 0.005f;
        }

        @Override
        public void describeTo(Description description) {
            description.appendText("Value expected is wrong");
        }
    };
}
于 2016-01-05T08:24:29.293 回答