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 はここまできちんと作っていない気が (を