Тесты завершаются успешно, если они выполняются из eclipse (STS), но возникают ошибки при запуске из Grails с ClassNotFoundException.

Я получаю разные результаты тестов при запуске из eclipse (STS) и из Grails.

В grails ошибка моих тестов (т.е. даже не запускается) с ClassNotFoundException

В eclipse они работают успешно.

(И run-app по-прежнему отлично работает при запуске из grails FWIW.)

Тесты работали в обеих средах несколько дней. Затем я удалил ряд ненужных мне файлов (домены. контроллеры и юнит-тесты на них) Теперь у меня проблема.

Версии:

ubuntu 10.04
eclipse
eclipse / SpringToolSuite 3.4.0
 - groovy compiler: groovy 2.07
 - grails location: /home/nick/grails-2.3.6
 - JDK compliance level 1.6
 - JAVA_HOME=/usr/lib/jvm/java-6-openjdk
grails 2.3.6
 - GRAILS_HOME=/home/nick/grails-2.3.6
 - JAVA_HOME=/usr/lib/jvm/java-6-openjdk

затмение / SpringToolSuite 3.4.0

Все по-прежнему прекрасно и денди изнутри eclipse / STS

select project
run as > junit test
runs 24 tests in 3 test classes
all succeed

грааль 2.3.6

Но изнутри Grails в терминале тесты больше не запускаются.

grails> test-app
| Compiling 2 source files.
| Error Fatal error running tests: Could not load class in test type 'unit' (Use --stacktrace to see the full trace)
| Compiling 2 source files..
| Tests FAILED  - view reports in /home/nick/grails-2.3.6-workspace/imca2/target/test-reports

Просмотр отчетов о тестировании показывает: Тесты не выполнены.

Добавление --stacktrace не имеет значения, трассировка стека не предоставляется, и мне по-прежнему рекомендуется добавить --stacktrace.

grails test-app --stacktrace | tee /tmp/out

дает

| Loading Grails 2.3.6
| Configuring classpath
| Configuring classpath.
| Environment set to test
| Environment set to test.
| Environment set to test..
| Environment set to test...
| Environment set to test....
| Environment set to test.....
| Running without daemon...
| Compiling 1 source files
| Compiling 1 source files.
| Error Fatal error running tests: Could not load class in test type 'unit' (NOTE: Stack trace has been filtered. Use --verbose to see entire trace.)
java.lang.RuntimeException: Could not load class in test type 'unit'
    at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1254)
    at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1254)
    at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1254)
    at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1254)
    at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1254)
Caused by: java.lang.ClassNotFoundException: com.ubergen.AdvocacyStaffSpec
    ... 5 more
| Error Fatal error running tests: Could not load class in test type 'unit'
| Compiling 1 source files..
| Tests FAILED  - view reports in /home/nick/grails-2.3.6-workspace/imca2/target/test-reports
| Error Error running forked test-app: Could not load class in test type 'unit' (NOTE: Stack trace has been filtered. Use --verbose to see entire trace.)
java.lang.RuntimeException: Could not load class in test type 'unit'
    at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1254)
    at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1254)
    at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1254)
    at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1254)
    at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1254)
Caused by: java.lang.ClassNotFoundException: com.ubergen.AdvocacyStaffSpec
    ... 5 more
| Error Error running forked test-app: Could not load class in test type 'unit'
| Error Forked Grails VM exited with error

Сначала я пробовал использовать Grails в чистоте и чистоте. Затем test-app перекомпилирует все, но это не имеет значения - eclipse по-прежнему успешно выполняет тесты, а Grails по-прежнему выдает ошибки, не запуская ни одного из них; и не имеет значения, в каком порядке я их запускаю.

Также не имеет значения, в каком порядке я запускаю тесты.

Что я должен делать?


person NickHollingsworth    schedule 27.02.2014    source источник
comment
Я думаю, вы бы уже проверили это, но уверены ли вы, что у вас нет классов модульного тестирования, для которых вы удалили соответствующий класс контроллера/домена и/или наоборот?   -  person dmahapatro    schedule 27.02.2014
comment
Проблема оказалась в том, что я не следовал соглашению об именах тестов из-за опечатки. Я опубликую подробности позже.   -  person NickHollingsworth    schedule 27.02.2014
comment
Да, это то, что я пропустил, чтобы упомянуть. имя модульного теста, оканчивающееся на *Tests.groovy против *Test.groovy. Я думаю, это то, на что вы указывали.   -  person dmahapatro    schedule 27.02.2014
comment
Мой предметный класс назывался AdvocacyStaff, а мой спок-тест назывался AdvocateStaffSpec. Это работает в eclipse, но не в граалях в терминале. (Подробный пример в качестве ответа ниже).   -  person NickHollingsworth    schedule 01.03.2014


Ответы (1)


На случай, если это кому-нибудь поможет, я отправляю свой собственный ответ после отслеживания проблемы.

Так как трассировка стека показала только один из спок-тестов. Grails мог успешно запускать другие.

При ближайшем рассмотрении оказалось, что в неудачном тесте было неправильно введено имя класса. Я не смотрел достаточно внимательно, так как его название - всего лишь условность, или я так думал.

Итак, если предположить, что существует класс CorrectName, который нуждается в тестировании, но тест ошибочно введен как WrongNameSpec вместо CorrectNameSpec...

Вот ошибочный тестовый код в CorrectName.groovy:

[snip]
@TestFor(CorrectName)
class WrongNameSpec extends Specification {
[snip]

Это работает в eclipse/STS и успешно тестирует класс CorrectName.

В Grails происходит сбой с трассировкой стека, которая говорит:

| Error Fatal error running tests: Could not load class in test type 'unit'
Caused by: java.lang.ClassNotFoundException: com.ubergen.CorrectNameSpec

Grails и eclipse имеют разные целевые области для размещения скомпилированного кода. Вот файлы классов:

./target-eclipse/classes/com/ubergen/WrongNameSpec.class
./target/test-classes/unit/com/ubergen/WrongNameSpec.class

Как сказано в трассировке стека, класса CorrectNameSpec не существует.

Это исправленный код, и он работает нормально в обоих случаях:

[snip]
@TestFor(CorrectName)
class CorrectName extends Specification {
[snip]

Grails делает что-то вроде создания списка тестов из @TestFor, но предполагает, что имя тестового класса соответствует ожидаемому соглашению.

Обзор:

В eclipse/sts имя модульного теста является условным, имеет значение @TestFor. В Grails имя модульного теста является не просто соглашением, вы должны называть его так, как ожидалось, потому что Grails предполагает, что существует файл класса с таким именем, и вы получите исключение ClassNotFoundException.

person NickHollingsworth    schedule 01.03.2014