Robolectric 4.4でJava 9必須のAPI Levelを対象とした時、Android Studio 4.0の同梱JDKで動かないのを回避する
AndroidでJSONを操作するところのUnit Testを書こうと思ったら、Robolectricが動かなくて困ったのでメモ
環境
- Android Studio 4.0.1
- Robolectric 4.4
- targetSdkVersion 30
Robolectric 4.3.1からはリリースノートにある通り、API Level 29が対象の時にはJava 9が必須になっている
そしてAndroid Studio 4.0に同梱されているのはJava 8系なので動かない
解決の方法としては以下の2通りが考えられる
- Java 9以降のJDKをインストールする
- Robolectricの対象API Levelを下げる
個人的にはAndroid Studio以外にインストールするものがあるのは面倒だし、環境を作り直すときに確実に忘れるので 対象API Levelを下げる
方向で対処する
Robolectricで対象のAPI Levelを設定するには以下のような方法がある
- @Config annotationで指定する
- robolectric.propertiesで指定する
- RobolectricTestRunnerをextendする
ただどれも面倒だと思ってしまったので、今回は build.gradle.kts
を編集する
公式サイトにあるようにRobolectricは targetSdkVersion
に指定されているバージョンを対象にしている
このため、例えばbuild.gradle.ktsが以下のようになっているとAPI Level 29が使用される
android {
defaultConfig {
targetSdkVersion(29)
}
}
であるならば、testの実行時だけtargetSdkVersionを書き換えれば、他のAPI Levelを使用するよう設定できる
どうするかというと
android {
defaultConfig {
targetSdkVersion(29)
}
testOptions {
defaultConfig {
targetSdkVersion(28)
}
}
}
これでUnit TestとInstrumented Testの両方に作用する
Unit Testだけに絞るなら以下のようにネストすれば良い
android {
defaultConfig {
targetSdkVersion(29)
}
testOptions {
unitTests {
defaultConfig {
targetSdkVersion(28)
}
}
}
}