Подтвердить что ты не робот

Robolectric: Ресурсы $NotFoundException: Идентификатор ресурса String с Android Gradle Плагин 3

Android Studio 3.0 Beta2
classpath 'com.android.tools.build:gradle:3.0.0-beta3'
testCompile 'org.robolectric:robolectric:3.4.2'

Тест-класс, который я использую, не запускается:

@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.LOLLIPOP)
@RunWith(RobolectricTestRunner.class)
public class RecipeAdapterTest {
    private MainActivity activity;

    @Before
    public void setup() {

    activity = Robolectric.setupActivity(MainActivity.class);

    /* Also tried this same Error
     activity = Robolectric.buildActivity(MainActivity)
                .create()
                .resume()
                .get();
    */
    }

    @Test
    public void testActivityShouldNotBeNull() {
        assertThat(activity, is(notNullValue()));
    }
}

Это трассировка стека ошибки:

android.content.res.Resources$NotFoundException: String resource ID #0x7f0c0020

    at android.content.res.Resources.getText(Resources.java:274)
    at android.content.res.Resources.getString(Resources.java:360)
    at android.content.Context.getString(Context.java:376)
    at org.robolectric.shadows.ShadowActivity.getActivityTitle(ShadowActivity.java:100)
    at org.robolectric.shadows.ShadowActivity.callAttach(ShadowActivity.java:110)
    at org.robolectric.android.controller.ActivityController.attach(ActivityController.java:56)
    at org.robolectric.android.controller.ActivityController.of(ActivityController.java:25)
    at org.robolectric.Robolectric.buildActivity(Robolectric.java:98)
    at org.robolectric.Robolectric.buildActivity(Robolectric.java:94)
    at org.robolectric.Robolectric.setupActivity(Robolectric.java:102)
    at me.androidbox.busbybaking.adapters.RecipeAdapterTest.setup(RecipeAdapterTest.java:63)

В Edit Configurations я установил Working Directory в $MODULE_DIR$

Большое спасибо за любое предложение.

4b9b3361

Ответ 1

Как отметил инженер из команды Google (скорее всего, Ксавье Дюкрохет), у Robolectric есть проблемы с AAPT2:

Robolectric не совместим с aapt2.

Два варианта здесь.

Первый вариант - следовать указаниям Robolectric для Android Studio 3. 0+

Добавьте следующее в свой build.gradle:

android {
  testOptions {
    unitTests {
      includeAndroidResources = true
    }
  }
}

Аннотируйте ваш тест с помощью Robolectric Test Runner:

@RunWith(RobolectricTestRunner.class)
public class SandwichTest {
}

Второй вариант: отключите AAPT2, добавив следующую строку в файл gradle.properties:

android.enableAapt2=false

Ответ 2

В документации Robolectric говорится, что с Android Studio 3.x следует использовать следующую конфигурацию:

android {
  testOptions {
    unitTests.includeAndroidResources true
  }
}

Ответ 3

Если ваша сборка завершилась неудачно из-за проблемы с обработкой ресурсов AAPT2 или вы хотите использовать Roboelectric, вы можете отключить AAPT2, установив android.enableAapt2=false в ваш gradle.properties файл и перезапустив демона Gradle, запустив ./gradlew --stop из командной строки.

Официальное руководство Android Studio 3.0 Release

Ответ 4

(для тех, кто ищет решение аналогичной проблемы)


Обязательно используйте

RuntimeEnvironment.application

а не:

RuntimeEnvironment.systemContext

когда вы пытаетесь разрешить ресурсы "вручную".

Это один случай, когда Resources$NotFoundException могут отображаться с Robolectric.

Ответ 5

Я использовал эспрессо, и для этого вам нужно было использовать ресурсы приложения, а не ресурсы тестирования.

Так что вместо

InstrumentationRegistry.getInstrumentation().context.resources.getString("key")

я использовал

activityRule.activity.getString("key")

Ответ 6

В моем случае следующее решило мою проблему: "Проблема связана с Android Studio. Перейдите в" Выполнить "->" Редактировать конфигурации... "и измените значение" Рабочая папка "на $ MODULE_DIR $.

Запустите ваши тесты.

Более подробная информация здесь в разделе "Сборка с Android Studio". "

ссылка: https://github.com/robolectric/robolectric/issues/2653

Ответ 7

Вы также @Config(manifest = "<projectFolder>/src/main/AndroidManifest.xml") попробовать @Config(manifest = "<projectFolder>/src/main/AndroidManifest.xml") в случае, если вы не можете просто включить ресурсы, так как тесты некоторых проектов не будут выполнены с включенным.