Robolectric говорит, что "AndroidManifest.xml не найден"
При попытке заставить Robolectric RC3 работать в Android Studio, я получаю
Caused by: java.lang.RuntimeException: build/intermediates/bundles/debug/AndroidManifest.xml not found or not a file; it should point to your project AndroidManifest.xml
at org.robolectric.manifest.AndroidManifest.validate(AndroidManifest.java:120)
at org.robolectric.manifest.AndroidManifest.getResourcePath(AndroidManifest.java:469)
at org.robolectric.manifest.AndroidManifest.getIncludedResourcePaths(AndroidManifest.java:475)
at org.robolectric.RobolectricTestRunner.createAppResourceLoader(RobolectricTestRunner.java:479)
at org.robolectric.RobolectricTestRunner.getAppResourceLoader(RobolectricTestRunner.java:471)
at org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:73)
at org.robolectric.RobolectricTestRunner.setUpApplicationState(RobolectricTestRunner.java:421)
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:234)
Я пробовал
@Config(manifest = "app/src/main/AndroidManifest.xml", constants = BuildConfig.class, sdk=21)
и я попытался установить расположение манифеста в своем TestRunner, ничего не получилось. В файловой системе я вижу, что манифест находится в
./app/build/intermediates/manifests/full/debug/AndroidManifest.xml
не в месте нахождения Robolectric.
В какой-то момент манифест просто проигнорировался, затем аналогичная проблема возникла для ресурсов, приложение или Robolectric не смогли найти сырьевой ресурс, который использует мое приложение.
Это в моем файле сборки:
sourceSets {
main {
java.srcDirs = ['src/main/java']
resources.srcDirs = ['src/main/res']
}
test {
java.srcDirs = ['src/test/java', 'src/main/java']
resources.srcDirs = ['src/test/res', 'src/main/res']
}
}
Как сказать Robolectric, где искать манифест, и что еще более важно, где искать ресурсы?
Изменить:
Я проверил Robolectric из github, я его построил, установил в своем локальном репозитории .m2, файл gradle теперь относится к локальной сборке SNAPSHOT, и я убедился, что gradle не получит новую версию от удаленного репо. Затем я скопировал RobolectricGradleTestRunner в свой проект, я изменил строки, в которых определены местоположения файлов: он не содержит имени модуля. Теперь это работает.
Ответы
Ответ 1
Я предполагаю, что вы пытаетесь запустить тесты с помощью JUnit. Вы можете попробовать две разные вещи:
- Создайте собственный класс TestRunner, как показано здесь. Проверьте раздел CustomTestRunner, где вы в основном создаете TestRunner, который фактически знает правильный манифест для использования. Укажите свои тесты для их запуска с помощью вашего тестового бегуна с аннотацией
@Config
.
- (Мой предпочтительный выбор). Перейдите в конфигурацию JUnit, Запустите > Изменить конфигурации. Обратите внимание на текстовое поле "Рабочий каталог". Добавьте
/app
(для OSX и Linux) или \app
(Windows) в путь, написанный в текстовом поле. Попробуйте снова запустить, и он должен работать.
Ответ 2
Такая же проблема для Android Studio. Я решил эту проблему, чтобы отредактировать конфигурацию Unit4. вы можете следовать этим.
В Android Studio.
- Изменить конфигурации
- В Junit вы должны изменить рабочий каталог на $MODULE_DIR $.
Важно $MODULE_DIR $.
вы можете ссылаться на следующий снимок экрана. спасибо.
![введите описание изображения здесь]()
![введите описание изображения здесь]()
Ответ 3
Я столкнулся с такими же ошибками, мы использовали несколько вкусов и типов
Итак, есть шаги, чтобы заставить его работать:
- Тесты студии Android запускают конфигурацию
Вы также должны установить рабочий каталог в $MODULE_DIR $в Windows. http://robolectric.org/getting-started/ должен сказать это.
-
Unit test должен быть аннотирован следующим образом:
@RunWith (RobolectricTestRunner.class)
@Config (константы = BuildConfig.class, sdk = 21, manifest = "src/main/AndroidManifest.xml", packageName = "com.example.yourproject" )
public class SomeFragmentTest {
Ответ 4
Если вы все еще получаете эту ошибку с Android Studio 3.0, убедитесь, что ваша конфигурация gradle имеет следующие параметры:
android {
...
testOptions {
unitTests {
includeAndroidResources = true
}
}
}
Ответ 5
Обратите внимание, что intellij 16 EAP имеет ошибку об этой переменной $MODULE_DIR $(она указывает на неправильное место), в результате чего тесты сбой исключаются из этого исключения. См. https://youtrack.jetbrains.com/issue/IDEA-149802#tab=History. Должен быть установлен в середине января 2016 года.
Ответ 6
Вы можете указать ту же проблему здесь: https://github.com/robolectric/robolectric/issues/1648
Вы должны упомянуть об этом в своем тестовом коде:
@Config(manifest = "src/main/AndroidManifest.xml", emulateSdk = 18)
Это говорит robolectric, где находится ваш файл манифеста. Это должно работать, если вы не измените значения своего каталога.
также попробуйте использовать шаблон, доступный в Интернете. Все там настроено. Вам не нужно менять значения каталога. Вы можете получить это отсюда: https://github.com/robolectric/deckard-gradle
Изменить: способ, которым я вижу, - это исключение, возникающее при "build/intermediates/bundles/debug/AndroidManifest.xml "
, но вы говорите, что файл находится в "app/build/intermediates/manifests/full/debug/AndroidManifest.xml"
, я думаю, что эти два разных местоположения. Убедитесь, что у вас есть xml файл в build/intermediates/bundles/debug/AndroidManifest.xml "
Ответ 7
Это правильно @Кристина. Я также сталкиваюсь с точной проблемой. И дело в том, что процесс сборки не создает папку пакетов вообще под промежуточными звеньями. И обычай robolectric бегун также не работал. Вот пользовательский runner I
используемый. Я еще не понял решение, но кажется, что проблема может быть связана с версией инструмента сборки, которая должна использоваться.
[Update] Меняет рабочий каталог в моей конфигурации unit test, чтобы указать на корневой каталог модуля, который тестируется. [Update]
Ответ 8
У меня была эта ошибка после того, как я обновил AndroidStudio до 2.3.3, а также обновлен плагин gradle.
Он был решен, установив working directory
в $MODULE_DIR$
, а также обновив зависимость robolectric
от testCompile 'org.robolectric:robolectric:3.0'
до testCompile 'org.robolectric:robolectric:3.4.2'
.
Обратите внимание, что установка working directory
в то время как версия robolectric
устарела, не решит ее.
Ответ 9
Hi All Iam new to RoboElectric was facing lot of struggle to run my first test
please find the below steps which resolves all the issues.
Step 1: use the version in dependencies
testImplementation"org.robolectric:robolectric:4.0" in app.gradle
step 2:
in app.gradle inside android use below
testOptions {
unitTests {
includeAndroidResources = true
}
}
шаг 3: в gradle.properties вставьте ниже
enableUnitTestBinaryResources = верно
Оно работает !!!