Espresso 在布局中获取动态创建的子项

Espresso get dynamically created child in layout

Button.java

public class Button extends FrameLayout {
    public Button(Context context, AttributeSet attrs) {
        super(context, attrs);
        TextView textView = new TextView(context);
        textView.setText("Test");
    }
}

layout.xml

<LinearLayout>
    <com.Button id="button_1" />
    <com.Button id="button_2" />
</LinearLayout>

如何使用 Espresso 访问在 Button 中创建的 TextView 并验证其文本?

onView(withId(R.id.button_1)<get_child>).check(matches(withText("Test")));
onView(withId(R.id.button_1)).check(matches(withChildText("Test")));

static Matcher<View> withChildText(final String string) {
    return new BoundedMatcher<View, FrameLayout>(FrameLayout.class) {
        @Override
        public boolean matchesSafely(FrameLayout view) {
            View child = view.getChildAt(0);
            if (child != null && child instanceof TextView) {
                return ((TextView) child).getText().toString().equals(string);
            }
            return false;
        }

        @Override
        public void describeTo(Description description) {
            description.appendText("with child text: ");
        }
    };
}