読者です 読者をやめる 読者になる 読者になる

うさがにっき

読書感想文とプログラムのこと書いてきます

onDataでCustomAdapterを使ったlistviewのテスト方法

Android Espresso

概要

EspressoでonDataを使えばlistviewのadapterをテストできるという記事はよく見かけるが、customAdapterに対してどうすればテストができるかという日本語記事はほとんどなかった
のでまとめた

詳細

onDataとは?

onDataはAdapterView(ListViewとか)のテストに使う
AdapterViewはAdapterからデータを複数読み込み、1データ1項目として展開するView
つまり、同じ見た目のViewが複数存在することになる
AdapterViewの子要素は必要に応じてView階層に組み込まれるため、通常のViewのように簡単にonViewで見つけることができない
onDataを使うと、子要素を操作する前に子要素をロードし、テストが行える状態にしてくれる

どう使うの?

spinnerとかだと以下の感じ
Espresso basics

CustomAdapterだと?

ここからが本題
listViewでは往々にして自分でAdapterを作ってlistViewを実現している、この場合のテスト方法
結論から言うと、自作のViewMatcherを作ってそこで、Adapter内の比較したい要素を比較するのが一番楽だった

適当なCustomViewActionクラスを作ってそこにガンガン追加していく

    // この場合はStringを比較したい
    public static Matcher<Object> checkToolText(final String toolText) {
        // ToolListAdapterDataというのがAdapter内に保持されてるデータ、つまりlistview.getItemで帰ってくるデータ
        return new BoundedMatcher<Object, ToolListAdapterData>(ToolListAdapterData.class) {
            @Override
            public boolean matchesSafely(ToolListAdapterData toolListAdapterData) {
                // 今回はテキストだけを比較、ここで色々Adapter内のデータとあっているか比較する
                return toolText.equals(toolListAdapterData.toolTitle);
            }

            @Override
            public void describeTo(Description description) {
                description.appendText("with content '" + toolText + "'");
            }
        };
    }

利用方法はこんな感じ
これでadapter内にtest文字列がいるかテストできる

onData(CustomViewActions.checkToolText("test")).check(matches(isDisplayed()));