前回の続き
http://qiita.com/kojimamasahiro/items/9a925975b2c5f632ed09
Robolectricしたい。
http://robolectric.org/
公式サンプル
https://github.com/robolectric/robolectric-samples
インストール
depences {
// robolectric
testCompile "org.robolectric:robolectric:3.1.4"
}
テストファイルはtestディレクトリ以下に置きます。
使い方
Activityのテスト
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class)
public class MainActivityTest {
private TextView mText;
private ImageView mImage;
private Button mButton;
@Before
public void setUp() {
// viewの取得
Activity activity = Robolectric.setupActivity(MainActivity.class);
mText = (TextView) activity.findViewById(R.id.text);
mButton = (Button) activity.findViewById(R.id.button);
mImage = (ImageView) activity.findViewById(R.id.image);
}
@Test
public void trueNextActivity() {
// ボタンのclick(別のアクティビティに遷移させるようにしていた場合)
mButton.performClick();
// 遷移先のActivityがあるか
ShadowApplication application = shadowOf(RuntimeEnvironment.application);
assertThat("Next activity has started", application.getNextStartedActivity(), is(notNullValue()));
}
@Test
public void falseNextActivity() {
// ボタンをclickしていないのでなし
ShadowApplication application = shadowOf(RuntimeEnvironment.application);
assertThat("Next activity should not started", application.getNextStartedActivity(), is(nullValue()));
}
}
Shadowクラス
shadowクラス
// 実オブジェクトを指定
@Implements(MyTextView.class)
public class ShadowMyTextView {
// メソッドを変更
@Implementation
public String myMethod() {
return "my name is ShadowMyTextView";
}
}
実オブジェクト
public class MyTextView {
public String myMethod() {
return "my name is MyTextView";
}
}
Configのshadowsに指定する
@RunWith(RobolectricTestRunner.class)
@Config(sdk = 21, constants = BuildConfig.class, shadows = {ShadowMyTextView.class})
public class MyTextViewTest {
@Test
public void shadowMyTextView() {
// メソッドが書き換えられている
assertThat(new MyTextView().myMethod(), is("my name is ShadowMyTextView"));
}
}
他、config propertiesやresourcesなどの設定方法もあるけど、割愛
おわりに
テストに関する投稿はこれでいったんおしまい。
アプリを新規でつくる場合は、積極的に取り入れていきたい。
ただ、既存のアプリに取り入れるのは少しつらい。
もし、いい感じに取り入れる方法があればまた紹介したい。