Robolectricのバージョンを4.8.1から4.10.3にアップデートしようとしたところ、以下の箇所でエラーが発生した。
ReflectionHelpers.setStaticField(Build.VERSION::class.java, "SDK_INT", Build.VERSION_CODES.N_MR1)
エラーの内容は以下の通り。
java.lang.RuntimeException: java.lang.IllegalArgumentException: Cannot set the value of final field public static final int android.os.Build$VERSION.SDK_INT
java.lang.RuntimeException: java.lang.RuntimeException: java.lang.IllegalArgumentException: Cannot set the value of final field public static final int android.os.Build$VERSION.SDK_INT
at org.robolectric.util.ReflectionHelpers.setStaticField(ReflectionHelpers.java:227)
修正したこと
・クラスに@Runwith(RobolectricTestRunner::class)のアノテーションを追加。
・ReflectionHelpers.setStaticFieldの使用箇所を削除。
・テスト関数ごとに@Config(sdk = [Build.VERSION_CODES.O])を記載。
このテストクラスでは、テスト関数ごとにテストするOSバージョンを切り替える必要がありました。
本来、@ConfigアノテーションでOSバージョンを指定するのは、@Runwith同様に、クラスに対して付与すれば十分です。ただ、今回のように、関数ごとにテストするOSを切り替えたい時は、テスト関数に@Configアノテーションを付ければOKでした。
@Test
@Config(sdk = [Build.VERSION_CODES.N_MR1])
fun test_VERSION_CODES_N_MR1() {}
@Test
@Config(sdk = [Build.VERSION_CODES.O])
fun test_VERSION_CODES_O() {}
上記のようにすることで、関数ごとに使用するOSバージョンを切り替えられました!
コメント