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$
Большое спасибо за любое предложение.
Ответы
Ответ 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")
в случае, если вы не можете просто включить ресурсы, так как тесты некоторых проектов не будут выполнены с включенным.