2

BottomNavigationItemViewItemViewメソッドを持つインターフェースを実装しますsetChecked()

Espresso で 1 つの itemView がチェックされていることをアサートしようとしましたが、予想される値が何であれ、同じエラーが発生しましisChecked()isNotChecked()

私のテスト:

ViewInteraction buttonHome = onView(
    allOf(withId(R.id.bottomHome),
          childAtPosition(
              childAtPosition(
                  withId(R.id.bottom_navigation),
                  0),
              0),
          isDisplayed()));
    buttonHome.check(matches(isNotChecked()));

エラーメッセージ

android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: 'with checkbox state: is <true>' doesn't match the selected view.
Expected: with checkbox state: is <true>
Got: "BottomNavigationItemView{id=2131493015, res-name=bottomHome, visibility=VISIBLE, width=360, height=168, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=true, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=2}"

BottomNavigationItemViewaが の現在選択されているアイテムであると断言するにはどうすればよいBottomNavigationViewですか?

4

2 に答える 2

7

どちらも、 Checkableインターフェイスがビューによって実装されることisChecked()isNotChecked()期待しています。

さらに、フィールドBottomNavigationItemView内のチェック済みステータスを非表示にしますitemData。これは、すぐに使用できる Espresso がこの種のチェックをサポートしていないことを意味します。幸いなことに、Espresso は非常に拡張可能なフレームワークであり、簡単に機能を追加できます。この場合、チェックを行うためにカスタムマッチャーを作成する必要があります。

上記のマッチャーの実装は次のようになります。

public static Matcher<View> withBottomNavItemCheckedStatus(final boolean isChecked) {
    return new BoundedMatcher<View, BottomNavigationItemView>(BottomNavigationItemView.class) {
        boolean triedMatching;

        @Override
        public void describeTo(Description description) {
            if (triedMatching) {
                description.appendText("with BottomNavigationItem check status: " + String.valueOf(isChecked));
                description.appendText("But was: " + String.valueOf(!isChecked));
            }
        }

        @Override
        protected boolean matchesSafely(BottomNavigationItemView item) {
            triedMatching = true;
            return item.getItemData().isChecked() == isChecked;
        }
    };
}

そして使用法は次のとおりです。

buttonHome.check(matches(withBottomNavItemCheckedStatus(false)));
于 2016-11-05T22:02:10.800 に答える