バージョンは下記:
Android Studio: 3.0 stable version
Robolectric: 3.5.1
現象はタイトルの通りで、上記バージョンのAndroidとRobolectricを使ってUnitテストを実行すると、AndroidのResourcesにアクセスする際にResourceNotFoundExceptionが発生しテストが失敗するというものです。(ちなみに自分の場合は、ローカルでの実行は正常に動きCI(Bitrise)上での実行時のみ失敗する、というものでした。)
あくまで自分のケースのみ有効かもしれませんが、下記に解決策を紹介します:
ResourceNotFoundExceptionに対する解決策#
app/build.gradleのandroid {}内に``testOptionsを追加し、Unitテスト実行時の設定を記述します。
testOptions {
unitTests {
includeAndroidResources = true
}
}```
`includeAndroidResources`に関するドキュメントは下記です:
[UnitTestOptions - Android Plugin 3.0.0-dev DSL Reference](https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.TestOptions.UnitTestOptions.html#com.android.build.gradle.internal.dsl.TestOptions.UnitTestOptions:includeAndroidResources)
このoptionを`true`にすることで、Unitテストの実行前にアセット、リソースやマニフェストのマージをプラグインが行ってくれるそうです。
これを指定することで`ResourceNotFoundException`を防ぎテストを正常に実行できるようになりました。
## (テスト実行時にthreetenbpに依存している場合の)`ZoneRulesException`に対する解決策
`includeAndroidResources`オプションを設定することで大半のテストは正常に実行されるようになったのですが、今度は下記のようなエラーログが出てテストが終了するという現象がありました。org.threeten.bp.zone.ZoneRulesException
at android.net.LocalSocketImpl.bind(LocalSocketImpl.java:303)
at android.net.LocalServerSocket.__constructor__(LocalServerSocket.java:48)
at android.net.LocalServerSocket.<init>(LocalServerSocket.java)
at com.facebook.stetho.server.LocalSocketServer.bindToSocket(LocalSocketServer.java:142)
at com.facebook.stetho.server.LocalSocketServer.listenOnAddress(LocalSocketServer.java:78)
at com.facebook.stetho.server.LocalSocketServer.run(LocalSocketServer.java:74)
at com.facebook.stetho.server.ServerManager$1.run(ServerManager.java:40)```
アプリではThreeTenABPを利用しているのですが、
IllegalStateException: TZDB.dat missing from assets```
というエラーログと共にテストが実行できないことに過去に悩まされた結果、
参考:
[IllegalStateException: TZDB.dat missing from assets · Issue #24 · JakeWharton/ThreeTenABP · GitHub](https://github.com/JakeWharton/ThreeTenABP/issues/24#issuecomment-217890751)
上記issueに記載されている解決策を元にテスト実行時にはThreeTenBPに依存するようにしていました。今回`ZoneRulesException`が出たタイミングでこの依存を試しに解消してみたところテストが正常に通ることがわかりました。(oh..)
予想としては`includeAndroidResources`が影響しているものと思っているのですが、具体的なところまでは調査できていません。
下記に今回調査する際にお世話になったサイト一覧を記載しておきます。雑ですが、以上です!
- [Android Plugin 3.0.0 DSL Reference](https://google.github.io/android-gradle-dsl/current/index.html)
- [IllegalStateException: TZDB.dat missing from assets · Issue #24 · JakeWharton/ThreeTenABP · GitHub](https://github.com/JakeWharton/ThreeTenABP/issues/24#issuecomment-217890751)
- [Getting resource not found exception · Issue #3324 · robolectric/robolectric · GitHub](https://github.com/robolectric/robolectric/issues/3324)