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
Спасибо, ребята!
Ответы
Ответ 1
Для этого существует несколько подходов:
- Укажите
AndroidManifest.xml
ваш targetSdkVersion
-
Создайте собственный RobolectricTestRunner
и переопределите getAppManifest
метод для указания целевого sdk. Например:
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)
.
-
Используйте @Config(emulateSdk=18)
аннотацию поверх вашего класса MainActivityTest
.
Третий подход является самым простым, но вы должны аннотировать все ваши тестовые классы. Я лично предпочитаю второй подход, так как дает большую гибкость в настройке вашего бегуна.
Ответ 2
Основываясь на ответе Андрея, я попытался решить свою проблему, но на самом деле я думаю, что @Config (emulateSdk = 18) был удален, и это то, что решило мою проблему:
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class
, sdk = 21)
public class SplashActivityTest {
......
}
Ответ 3
Заметки для пользователей Mac
Если вы находитесь на Mac, вам, вероятно, потребуется настроить конфигурацию тестового прогона JUnit по умолчанию, чтобы обойти ошибку, в которой IntelliJ/Android Studio не устанавливает рабочий каталог тестируемого модуля. Это можно сделать, отредактировав конфигурации запуска, Defaults → JUnit и изменив значение рабочего каталога на $MODULE_DIR $
Настройка:
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class)
public class FooTest {
}
https://github.com/robolectric/robolectric/wiki/Running-tests-in-Android-Studio