Ответ 1
Основная идея - использовать метод с внутренним ViewAction, который извлекает текст в его методе выполнения. Анонимные классы могут получить доступ только к конечным полям, поэтому мы не можем просто позволить ему установить локальную переменную 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];
}
Примечание. Этот вид ресиверов данных должен использоваться с осторожностью. Если вы постоянно обнаруживаете, что пишете такие методы, есть хороший шанс, вы делаете что-то не так с самого начала. Также никогда не обращайтесь к виду за пределами ViewAssertion
или ViewAction
, потому что только там он уверен, что взаимодействие безопасно, поскольку оно запускается из потока пользовательского интерфейса, а перед его выполнением проверяется, что никакие другие взаимодействий.