Robolectricのテストコードで、テスト関数ごとにOSバージョンを変更する方法

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バージョンを切り替えられました!

コメント

タイトルとURLをコピーしました