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.

Спасибо вам, ребята!


person anthony    schedule 26.05.2014    source источник


Ответы (3)


Для этого существует несколько подходов:

  1. Укажите в AndroidManifest.xml свой targetSdkVersion
  2. Создайте собственный метод 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).

  3. Используйте аннотацию @Config(emulateSdk=18) поверх класса MainActivityTest.

Третий подход — самый простой, но вы должны аннотировать все свои тестовые классы. Я лично предпочитаю второй подход, так как он дает больше гибкости в настройке бегуна.

person Andrei Catinean    schedule 26.05.2014
comment
Отлично Спасибо Андрей! - person anthony; 26.05.2014
comment
прочитайте последний комментарий: github.com/robolectric/robolectric/issues/1831 говоря: emulateSdk удален, нужно использовать константы=burrows.apps.example.template.BuildConfig, sdk=21 - person Karoly; 18.08.2015

Основываясь на ответе Андрея, я попытался решить свою проблему, но на самом деле я думаю, что @Config(emulateSdk=18) был удален, и это решило мою проблему:

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class
     , sdk = 21)
   public class SplashActivityTest {
  ......
  }
person Karoly    schedule 18.08.2015
comment
из вчерашнего опыта также работает следующее: создайте файл robolectric.properties (src/test/resources) и добавьте следующее: sdk=21. В этом случае вам не нужно добавлять в @Config каждый отдельный файл. - person Karoly; 11.05.2017

Примечания для пользователей 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/Запусктестов-в-Android-Studio

person Jake Graham Arnold    schedule 28.04.2016
comment
Это исправлено и в Ubuntu 14.04. - person Gus; 19.06.2017