Robolectric и Android Studio 1.1.0 и тестирование библиотеки

82
4

У меня возникают проблемы с тем, чтобы мои модульные тесты 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) работают нормально.

спросил(а) 2015-03-19T22:01:00+03:00 5 лет, 2 месяца назад
1
Решение
93

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 этот ответ, который показал мне, как принудительно добавлять материал в тестовый путь к классам.

ответил(а) 2015-03-27T19:41:00+03:00 5 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема