これは私の基本的なテストクラスです:
@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を使用します
君たちありがとう!
これにはいくつかのアプローチがあります。
AndroidManifest.xml
_でtargetSdkVersion
を指定しますカスタム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)
とともに使用します。
MainActivityTest
クラスの上に@Config(emulateSdk=18)
アノテーションを使用します。
3番目のアプローチは最も単純なアプローチですが、すべてのテストクラスに注釈を付ける必要があります。ランナーをより柔軟に構成できるので、私は個人的に2番目のアプローチを好みます。
Andreiの回答に基づいて、問題を解決しようとしましたが、実際には@Config(emulateSdk = 18)が削除されたと思います。これが、私の問題を解決した理由です。
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class
, sdk = 21)
public class SplashActivityTest {
......
}
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