2016/06/27

[android]Instrumented Unit Testsじゃないとandroid.jarは例外/デフォルト値を返す

こんなテストコードを書いた。

@Test
public void testTest() throws Exception {
    SparseArray<String> strMap = new SparseArray<>();
    strMap.put(0x00, "moji");
    String err1 = strMap.get(0x00, "momo");
    System.out.println(err1);
}

実行すると、nullになった。。。
newしてるのにnullか。


よくわからずに書いている箇所があるが、build.gradleのreturnDefaultValuesもそうだ。
これをコメントアウトすると、実行するとエラーになる。

java.lang.RuntimeException: Method put in android.util.SparseArray not mocked

これだ。
実機を動かさずに行うUnitTestではandroid.jarが空実装だから、例外になるようだ。
これを、例外を出さずにデフォルト値を返すようにするのが、returnDefaultValuesというわけだ。

 

SparseArrayは特にAndroid実機の機能を使っているわけでは無いのだろうけど、これを解決させるのに悩むくらいだったら、実機で動かしてしまった方が楽そうだ。

そういう、Mockなどを使わずに動かしてテストもしたいなら、Instrumented Unit Testsの方になるようだ。


Local Unit Testsを始めるときと同じように、書いてあるとおりにやると動いた。
テストを右クリックで生成するときに、どのフォルダに格納するか聞いてくるが、あれの先が「androidTest」になるのだな。

そして、build.gradleも「testCompile」じゃなくて「androidTestCompile」になる。
returnDefaultValuesはtrueのままでよいようだ。

実行すると、アプリが実機に転送されて実行し、ちゃんとassertThat()なんかも判定している。

 

android.jarのところも含めてMockにしてメソッドを動かしていくならLocal Unit Tests、android.jarはそのまま流して動かしたいならInstrumented Test Unitsがよいかな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。