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/тест')   } }

  1. Щелкните правой кнопкой мыши папку "src/test/java" в вкладке "Проект" и нажмите "Отметить каталог как" > "Корень источников тестирования"

Просто добавлю, я использую сообщество сообщества IDEA, и он отлично работает. Кроме того, мне не требуется взломать файл .iml или выкопать другие настройки внутри среды IDE.