web-dev-qa-db-ja.com

Android:RobolectricはAPIレベル1をサポートしていません

これは私の基本的なテストクラスです:

@RunWith(RobolectricTestRunner.class)
public class MainActivityTest {
  @Before
  public void setup() {
    //do whatever is necessary before every test
  }

  @Test
  public void testActivityFound() {
    Activity activity = Robolectric.buildActivity(MainActivity.class).create().get();

    Assert.assertNotNull(activity);
  }
}

Android Studioで、ターミナルウィンドウを使用してテストを実行すると、次のエラーが発生します。

Java.lang.UnsupportedOperationException: Robolectric does not support API level 1, sorry!
at org.robolectric.SdkConfig.<init>(SdkConfig.Java:24)
at org.robolectric.RobolectricTestRunner.pickSdkVersion(RobolectricTestRunner.Java:320)
at org.robolectric.RobolectricTestRunner.getEnvironment(RobolectricTestRunner.Java:296)
at org.robolectric.RobolectricTestRunner.access$300(RobolectricTestRunner.Java:61)
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.Java:202)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.Java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.Java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.Java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.Java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.Java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.Java:229)
at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.Java:177)
at org.junit.runners.ParentRunner.run(ParentRunner.Java:309)

Gradle情報:

compileSdkVersion 19
buildToolsVersion "19.0.1"

    minSdkVersion 14
    targetSdkVersion 19
    versionCode 2

androidTestCompile 'org.robolectric:robolectric:2.+'
androidTestCompile 'junit:junit:4.+'

私は最後のAndroid Studioバージョン:0.5.8を使用します

君たちありがとう!

20
anthony

これにはいくつかのアプローチがあります。

  1. _AndroidManifest.xml_でtargetSdkVersionを指定します
  2. カスタムRobolectricTestRunnerを作成し、ターゲットSDKを指定するためのgetAppManifestメソッドをオーバーライドします。例えば。:

    _public class MyCustomRunner extends RobolectricTestRunner {
    
        @Override
        protected AndroidManifest getAppManifest(Config config) {
    
            String manifestPath = "your_manifest_path";
            String resPath = "your_res_path";
            return new AndroidManifest(Fs.fileFromPath(manifestPath), Fs.fileFromPath(resPath)) {
                @Override
                public int getTargetSdkVersion() {
                    return 18;
                }
            }; 
        }
    }
    _

    次に、それをMainActivityTestクラスで@RunWith(MyCustomRunner.class)とともに使用します。

  3. MainActivityTestクラスの上に@Config(emulateSdk=18)アノテーションを使用します。

3番目のアプローチは最も単純なアプローチですが、すべてのテストクラスに注釈を付ける必要があります。ランナーをより柔軟に構成できるので、私は個人的に2番目のアプローチを好みます。

28
Andrei Catinean

Andreiの回答に基づいて、問題を解決しようとしましたが、実際には@Config(emulateSdk = 18)が削除されたと思います。これが、私の問題を解決した理由です。

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class
     , sdk = 21)
   public class SplashActivityTest {
  ......
  }
15
Karoly

Macユーザー向けの注意事項

Macを使用している場合は、IntelliJ/Android Studioが作業ディレクトリをモジュールに設定しないバグを回避するために、デフォルトのJUnitテストランナー構成を構成する必要があります。これは、実行構成を編集し、[デフォルト]-> [JUnit]を編集し、作業ディレクトリの値を$ MODULE_DIR $に変更することで実現できます。

セットアップ:

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class)
public class FooTest {
}

https://github.com/robolectric/robolectric/wiki/Running-tests-in-Android-Studio

4