Robolectric и Android Studio 1.1.0 и тестирование библиотеки
У меня возникают проблемы с тем, чтобы мои модульные тесты Robolectric выполнялись в рамках экспериментального варианта тестирования AS 1.1. Ошибка, которую я получаю, показана ниже;
java.lang.NoClassDefFoundError: com/my/app/R$string
at com.my.app.MoneyFormatter.formatDealMessage(MoneyFormatter.java:63)
...
Caused by: java.lang.ClassNotFoundException: com.my.app.R$string
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at org.robolectric.bytecode.AsmInstrumentingClassLoader.loadClass(AsmInstrumentingClassLoader.java:100)
... 46 more
Я извлекаю эту ошибку, выполнив из командной строки корневую (app-name in Snippet1) команду;
./gradlew core:library:test
Этот подход работает в Android Studio 1.1 без включения модульного тестирования и использования инструментария android gradle в версии 1.0 (com.android.tools.build:gradle:1.0.0).
Конфигурация проекта
Мой проект имеет сложную структуру, как указано ниже:
app-name
|
|->app
|->src
|-> androidTest // Espresso helper classes reside here
|-> androidTestFlavour1 // Espresso int tests relating to 'flavour 1'
|-> androidTestFlavour2 // Espresso int tests relating to 'flavour 2'
|-> flavour1
|-> flavour2
|-> main
+ AndroidManifest.xml // Manifest for apps
|-> testFlavour1 // Robolectric unit tests for flavour 1
|-> testFlavour2 // Robolectric unit tests for flavour 2
|->core
|->library
|-> src
|-> main // Library code resides here
+ AndroidManifest.xml
|-> test // Robolectric unit tests for library
+gradle
+gradlew
+settings.gradle
+local.properties
Фрагмент 1: Схема проекта
Я следил за различными советами Pivotal Labs и многими другими альтернативами home- brew без успеха.
Что такое сообщение об ошибке и что мне нужно изменить, чтобы это исправить?
Update:
Поэтому, проверяя путь к классам, который используется для запуска тестов, я заметил следующие пути к библиотеке:
- /workspace/app/core/lib/build/intermediates/bundles/debug/classes.jar
/рабочее пространство/приложение/ядро /Library/сборки/промежуточный/классы/тест/отладки
/рабочее пространство/приложение/ядро /Library/сборки/промежуточные/зависимость кэша/тестирования/отладки
Ни один из этих каталогов не содержит сгенерированный файл R$string.class
, следовательно, исключение. Каталог, содержащий сгенерированные "R" файлы, включает в себя типы отладки и выпуска. Таким образом,
- /рабочее пространство/приложение/ядро /Library/строить/промежуточный/классы/отладки
/рабочее пространство/приложение/ядро /Library/строить/промежуточные/классы/отпускания
Это указывает на то, что часть процесса сборки отсутствует, добавив ресурсы типа "отладка" или "выпуск". Это также поддерживает поведение, при котором тесты на чистой Java-среде (которые полагаются только на classes.jar) работают нормально.
OK! У меня это работает. Я добавил следующую строку в библиотеку build gradle для принудительного добавления сгенерированных файлов "R" в тестовый путь к классам;
sourceSets {
test.java.srcDirs += "build/generated/source/r/debug"
}
С этим я дошел до нирваны тестов Robolectric:
./gradlew core:lib:test
и интеграция на основе Espresso 2.0 с;
./gradlew connectedAndroidTest
Остановите часы для поддержки модулей и интеграции в среде IDE.... о, что это? 7 ЛЕТ?! Никакой любви не потеряно. Kudos to этот ответ, который показал мне, как принудительно добавлять материал в тестовый путь к классам.
- Вопросы
- Robolectric
- Robolectric и Android Studio 1.1.0 и тестирование библиотеки