./gradlew test
でUnit Testを実行した際にjava.lang.VerifyError
が発生しテストが全て失敗する場合の対処方法です。
以下のようにbuid.gradleにtestOptionsを追加します。
android {
testOptions {
unitTests.all {
jvmArgs "-noverify"
}
}
}
ただし./gradlew testDebug
ではjava.lang.VerifyError
が発生しません。
./gradlew test
を実行すると、testDebug
とtestRelease
の両方が実行されるため、java.lang.VerifyError
はtestRelease
の場合に発生していることがわかります。実際にtestRelease
を実行するとjava.lang.VerifyError
が発生しました。
これをもう少し掘り下げて調査すると、以下のコードが原因であったことがわかりました。
if (BuildConfig.DEBUG) {
return;
}
FlurryAgent.setLogEnabled(false);
FlurryAgent.init(this, getString(R.string.flurry_api_key));
testRelease
を実行することでFlurryの初期化がUnit Test実行時に行われていた結果java.lang.VerifyError
が発生していたと考えられます。
したがって、今回のケースではreleaseビルドでUnit Testを実行する理由が無いことから、Unit Testの実行は./gradlew testDebug
で行うことでjava.lang.VerifyError
の発生に対処することができました。
もし何らかの理由でtestReleaseを実行する必要がでた場合には、JVMオプションを指定する方法でUnit Testを実行しようと思います。