Robolectric ソース掘削 (5)

時間が無いので極力俯瞰的に確認の方向。
最初にランチャから起動される HomeActivity はボタンがみっつあってそこから

  • NamesActivity
  • RecentActivityActivity
  • InjectedActivity

を startActivity してるだけです。データ渡しも無し。なので HomeActivityTest の実装自体も画面遷移が中心になってます。
基本的な方法としては

  • ボタンの performClick を呼び出す (Click する)
  • 親 Activity のオブジェクトを shadowOf に渡して ShadowActivity オブジェクト取得
  • ShadowActivity#getNextStartedActivity メソドを呼び出して Intent なオブジェクトを取り出す
    • startActivity に渡した Intent を取り出す
  • 取り出した Intent なオブジェクトを shadowOf に渡して ShadowIntent オブジェクト取得
  • ShadowIntent#getComponent で取り出せるオブジェクトのクラス名を取得して assert

という形で、これが画面遷移の動作確認の一つの方法か。
他にもみっつほど遷移ではない assert があります。

  • View#getText() して設定されてる文字列の確認
  • View に設定されてるリソース ID の確認
  • View#getVisibility() の戻りが View.VISIBLE かどうかを確認

ざっくりと、ってことで NamesActivity を見てみます。ArrayList なオブジェクトの初期設定をして ListView に setAdapter してますね。
これは ListView の試験サンプルな模様。以下な形。

    @Before
    public void setUp() throws Exception {
        activity = new NamesActivity();
    }

    @Test
    public void shouldShowAListOfNames() throws Exception {
        activity.onCreate(null);
                        
        ListView namesListView = (ListView) activity.findViewById(R.id.names_list);

        TextView nameRow = (TextView) namesListView.getChildAt(1);

        assertThat(nameRow.getText().toString(), equalTo("Donald Rumsfeld"));
    }

こりゃまた簡単な。初期設定済みであれば確かにこれで何とかなりますね。あと NamesActivity で setAdapter してる

        ((ListView) findViewById(R.id.names_list)).setAdapter(new NamesAdapter(names));

NamesAdapter ですが、定義が別になってて試験もあります。Adapter な試験も可能なんですね。こちらも面白いです。あと、以下な試験も非常に興味深く拝見させて頂きました。

    @Test
    public void shouldRecycleProvidedViews() throws Exception {
        TextView existingView = new TextView(null);
        TextView nameView = (TextView) namesAdapter.getView(2, existingView, new LinearLayout(new Activity()));
        assertThat(nameView, sameInstance(existingView));
    }

ちょっと getView メソドの読み込みが足りていないのですが、最近作ったオレ Adapter はここまできちんと作っていない気が (を