Android Studio + Robolectric + Gradle Класс не найден Исключение
Я загрузил проект Robolectric deckard- gradle из https://github.com/robolectric/deckard-gradle и импортирован в Android Studio.
Во время моего первого запуска я получил
!!! JUnit version 3.8 or later expected:
java.lang.RuntimeException: Stub!
at junit.runner.BaseTestRunner.<init>(BaseTestRunner.java:5)
at junit.textui.TestRunner.<init>(TestRunner.java:54)
at junit.textui.TestRunner.<init>(TestRunner.java:48)
at junit.textui.TestRunner.<init>(TestRunner.java:41)
Ошибка и я исправил это из .iml.
Затем я получил:
Class Not Found "my test class"
Я пробовал десятки решений, которые я нашел в google об этой проблеме, но никто из них не работал.
Ответы
Ответ 1
UPDATE: Android Studio 1.1.0 добавила поддержку тестирования JUNIT 4 в среду IDE. Подробнее см.: https://sites.google.com/a/android.com/tools/tech-docs/unit-testing-support. Это должно исправить исключение STUB.
Вариант один из Alex - правильный ответ: сейчас я использую его в двух проектах, и вам грустно, что вы должны сделать это таким образом, но все, что вы можете сделать прямо сейчас.
Подробные инструкции:
- когда отображается STUB EXCEPTION, полностью копируется первая серая строка в редактор.
- В этой строке удалите все до -classpath и все после последней записи .jar. (Как сказал Алекс, путь к классам, но и удалить остальные после него)
- Найдите junit и переместите строку, похожую на следующую:/path/in/filesystem/.gradle/caches/modules-2/files-2.1/junit/junit/4.11/4e031bb61df09069aeb2bffb4019e7a5034a4ee0/junit-4.11.jar: на начало зависимостей непосредственно после директивы "-classpath".
- Добавьте тестовые классы в выходной каталог dir до конца пути к классам, например -classpath "/dependency1:/dependency2:/...:/Users/user/path/to/project/app/build/test-classes"
- Перейдите в раздел "Запуск конфигураций" в раскрывающемся меню, где для запуска тестов или приложения
- В вашей тестовой конфигурации junit (которую вы пытались запустить раньше, а не в тестах Android) добавьте текст сверху как параметры VM.
- Нажмите ok, запустите тест и voilà, он работает!
Кстати, для генерации выходных тестовых источников мне пришлось добавить
apply plugin: 'idea'
idea {
module {
testOutputDir = file('build/test-classes/debug')
}
}
к модулю build.gradle
Если вы все еще получаете ошибки при попытке использовать ui, перейдите к терминалу, включенному в студию android, и используйте. / gradle clean check (или эквивалентную команду), которая запускает проверки lint для вашего проекта и тестов. Если что-то пойдет не так с вашими тестами, вы будете проинформированы об этом и сможете просмотреть результаты на html-странице.
Ответ 2
Я боролся с той же проблемой и, наконец, получил ее для работы с этим решением (для Android Studio 1.0.2 и Robolectric 2.4):
-
Перейдите в свой модуль *.iml и переместите order-entry
с помощью jdkType='Android SDK'
к нижней части всех остальных order-entry
-элементов (это исправляет "заглушку" ).
-
Также в файле *.iml добавьте следующую запись output-test
непосредственно под элементом output
. Он должен выглядеть следующим образом:
<output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
<output-test url="file://$MODULE_DIR$/build/test-classes" />
- Наконец, перейдите к настройкам запуска Android Studio Menu → Run → Edit Configurations
- Добавьте новую конфигурацию Gradle (нажмите "+" → выберите "Gradle" ), назовите ее "Скомпилировать тестовые классы" (или что-то подобное), выберите ваш модуль как проект Gradle (просто используйте значок рядом с полем ввода для быстрого выбора) и заполните "Задачи" "compileDebugTestJava", нажмите "Применить"
- Теперь найдите свою конфигурацию запуска JUnit и найдите раздел "Перед запуском: Make" внизу. Нажмите "+" и выберите "Запустить другую конфигурацию". Выберите "Скомпилировать тестовые классы" (или имя, заданное для задачи Gradle), и последнее, но не менее важно переместить эту запись перед записью "Сделать", которая должна уже присутствовать.
Это отлично работает для меня. Теперь я могу запускать тесты непосредственно из Android Studio и не нужно манипулировать путем класса. Вот почему я чувствую, что это более удобно.
Ответ 3
Проблема в том, что Android Studio очень часто перезаписывает ваш .iml файл, поэтому, хотя вы его модифицировали, он, вероятно, был изменен.
Вариант 1: взломайте его для Android Studio
Вместо этого вы должны установить путь к классу как параметр виртуальной машины в своем тестовом прогоне и поставить путь к JUnit 4 перед всем остальным.
В конфигурации тестового прогона для опций VM добавьте -classpath
, затем путь к JUnit, а затем остальную часть вашего пути к классам (вы можете извлечь это из вывода Android Studio при попытке запустить тест, и он не работает, он в первой строке вывода, где вы скопировали свое сообщение).
Например:
-classpath "/Users/anothem/.gradle/caches/artifacts-26/filestore/junit/junit/4.11/jar/4e031bb61df09069aeb2bffb4019e7a5034a4ee0/junit-4.11.jar:[the rest of your classpath]
Вариант 2: используйте IntelliJ
На самом деле это не проблема, но я подумал, что я упоминал об этом. Если вы действительно не хотите висеть на Android Studio, вы можете использовать IntelliJ вместо этого (Android Studio "папа" ).
С помощью IntelliJ вы можете открыть настройки проекта и просто изменить порядок своих пакетов, чтобы JUnit4 и Robolectric приходили перед всем остальным.
Ответ 4
Комментарий от nemo указывает на это уже. Вы можете изменить свой файл iml. (плохо, что этот файл часто перезаписывается из студии android). Я использую пользовательскую задачу gradle, чтобы включить модульное тестирование внутри студии android. Измените файл iml и измените путь к ожидаемому для тестовых прогонов. Иногда я должен выполнить свой тест дважды, чтобы запустить его, потому что андроид-студия принимает изменения только при следующем тестовом прогоне, а не в текущем.
вот полный пример, который может быть включен в ваш gradle файл https://github.com/nenick/android-gradle-template/blob/master/Scripts/android-studio-robolectric-support.gradle
Ответ 5
Итак, есть несколько вещей, которые нужно иметь в виду, чтобы преодолеть проблемы с Android Studio, однако некоторые из них могут быть рекомендованы.
- Убедитесь, что вы работаете с JDK 1.7, который рекомендуется для разработки Android. [Исправить настройку]
- Текущая версия Robolectric- gradle версии 1.0.1 совместима с android- gradle версией 1.1.0 [Проверить файл build.gradle]
- Поместите свои тесты в каталог "src/test" и укажите это в APP build.gradle(внутри "android" ) следующим образом:
sourceSets { testLocal { setRoot ( 'SRC/тест') }
}
- Щелкните правой кнопкой мыши папку "src/test/java" в вкладке "Проект" и нажмите "Отметить каталог как" > "Корень источников тестирования"
Просто добавлю, я использую сообщество сообщества IDEA, и он отлично работает. Кроме того, мне не требуется взломать файл .iml или выкопать другие настройки внутри среды IDE.