web-dev-qa-db-ja.com

RobolectricにはJava 9が必要ですか?

すべてのテストに合格していますが、以下の警告が表示されます。 RobolectricからJava 9が必要です。Robolectricの最新バージョンを使用しています。

[Robolectric] WARN: Android SDK 10000 requires Java 9 (have Java 8). Tests won't be run on SDK 10000 unless explicitly requested.
[Robolectric] com.example.testcaseWithRobolectric.MainActivityTest.testAllElements: sdk=28; resources=BINARY
Called loadFromPath(/system/framework/framework-res.apk, true); mode=binary sdk=28

プロセスは終了コード0で終了しました

これは私のGradleです。

    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation 'com.Android.support:appcompat-v7:28.0.0'
        implementation 'com.Android.support.constraint:constraint-layout:1.1.3'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'com.Android.support.test:runner:1.0.2'
        androidTestImplementation 'com.Android.support.test.espresso:espresso-core:3.0.2'
        implementation project(path: ':domain_layer')
        testImplementation "org.robolectric:robolectric:4.3"
    }

defaultConfig {
        applicationId "com.example.testcaseWithRobolectric"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
    }
27
The_Martian

テストクラスでは、sdkの配列をパラメーターとして@Configで注釈を付ける必要があります。

@Config(sdk = [Build.VERSION_CODES.O_MR1])
class SampleTest {}

テストが実行されます。

23
chikwapuro

Robolectric 4.3.1 API 29のサポートが追加されましたが、次の要件があります。

Android API 29でテストを実行するには、Java9ランタイム以降が厳密に必要になります

したがって、API 29をターゲットにしている場合は、Java9を使用してRobolectricを実行する必要があります。


Android Studio

残念ながら、まだAndroid StudioプロジェクトでJDK9を使用するように設定することはできません(Android Studio 3.5.3)として): Project structure

ただし、ターゲットJREをテスト実行構成(Run / Edit Configuration)からJDK9に変更できます。 Test run configuration


Java 8

Java 9を使用したくない、または使用できない場合は、Java 8を使用してテストを実行できるようにするためにいくつかの回避策があります。

プロジェクト全体で下位SDKをエミュレートするようにRobolectricを構成します:

  1. robolectric.propertiesの下にapp/src/test/resourcesファイルを作成します。
  2. ファイルに次のように追加して、Android API28をエミュレートします。

robolectric.properties

sdk=28

注:マルチモジュールプロジェクトの場合、理論的には global robolectric.properties をプロジェクトのルートディレクトリに置くことができます。しかし、それを機能させることはできませんでした...したがって、残念ながら、すべてのモジュールのファイルを複製する必要がありました。 core/src/test/resources

ドキュメント: robolectric.propertiesファイル

特定のテストで下位のSDKをエミュレートするようにRobolectricを構成します:

エミュレートされたSDKをプロジェクト全体で構成したくない場合は、Robolectric @Configアノテーションを使用して、個別のテスト用に構成できます。

@RunWith(AndroidJUnit4::class)
@Config(sdk = [Build.VERSION_CODES.P])
class MyRobolectricTest {...}

ドキュメント: @ Configアノテーション

20
David Miguel

テストに注釈を付ける

@Config(sdk = Build.VERSION_CODES.O_MR1)

またはsdk =27。アノテーションは、エラーの原因となっているクラスまたはテストメソッドの上に配置できます。

Java 9が必要です)という警告が引き続き表示される場合がありますが、テストはサポートされているSDKに対して実行されます。

10
Wryday

Java 9で実行する必要があるのは、Androidに対してテストする場合のみです。Q。 https://github.com/robolectricの互換性セクションを確認してください。 /robolectric/releases/tag/robolectric-4.

5
Eugen Martynov