如果从eclipse(STS)运行测试成功,但如果从带有ClassNotFoundException的grails运行则会出错

时间:2014-02-27 14:39:04

标签: grails sts-springsourcetoolsuite grails-2.3

从eclipse(STS)和grails运行时,我得到了不同的测试结果。

在grails下我的测试错误(即甚至不运行)与ClassNotFoundException

在日食中他们成功运行。

(从grails FWIW开始运行时,run-app仍能正常工作。)

测试已经在这两种环境中工作了好几天。 然后我删除了一些我不需要的文件(域名。控制器和它们的单元测试) 现在我有一个问题。

版本:

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

eclipse / SpringToolSuite 3.4.0

在eclipse / STS中,一切都很好,花花公子

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

grails 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 clean and clean-all。 test-app然后重新编译所有内容,但它没有任何区别 - eclipse仍然成功运行测试,并且在没有运行任何这些测试的情况下仍然存在错误;并且我运行它们的顺序并不重要。

在我运行测试的顺序方面也没有任何区别。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

如果它对任何人都有帮助,我会在跟踪问题后发布自己的答案。

由于堆栈跟踪只显示了一个spock测试。 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。