从Cygwin终端运行JUnit 4时出现“ NoClassDefFoundError”

时间:2019-01-21 20:36:15

标签: java junit cygwin classpath noclassdeffounderror

之前,我下载了junit-4.12.jarhamcrest-core-1.3.jar并将它们添加到Windows CLASSPATH中。当我想运行JUnit测试时,我打开Cygwin终端,导航到测试类的目录,然后运行

$ java org.junit.runner.JUnitCore TestClass

或者,如果我不在正确的目录中,请键入由\分隔的类的相对文件路径(我已经读到,在Windows上运行{ {1}}或java)。

我从其他人提供的javac编译了测试类。该测试最初应该抛出TestClass.java,但我却收到了testThrowsIllegalArgumentException() –好像程序在实际测试之前就以某种方式失败了–随后是stacktrace:

NoClassDefFoundError

(之间有更多的堆栈跟踪,为了节省空间,我已将其删除,因为对我来说重要的唯一内部步骤是开始和结束。不过,如有必要,我可以编辑帖子以包括完整的堆栈跟踪, )

我查看了我认为相关的所有其他常见问题解答和StackExchange线程,但没有找到解决问题的答案。目前看来,这可能与JUnit version 4.12 Exception in thread "main" java.lang.NoClassDefFoundError: proj/TestClass (wrong name: TestClass) at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader.defineClass(Unknown Source) ... at org.junit.runner.JUnitCore.runMain(JUnitCore.java:72) at org.junit.runner.JUnitCore.main(JUnitCore.java:36) 有关。我尝试添加测试类的目录和使用CLASSPATH测试的原始类的目录,但是像其他所有内容一样,它没有用。任何进一步的帮助将不胜感激,因为我现在完全不知所措。

1 个答案:

答案 0 :(得分:1)

经过大量的实验,我终于解决了自己的问题。

我的项目目录最初是为Eclipse设计的(我很早就决定,如果可以帮助的话,我宁愿不安装Eclipse,这也许就是为什么我首先遇到这个问题的原因)。它的结构如下:

proj  
| src  
| | main  
| | | java  
| | | | proj  
| | | | | Class.java  
| | | | | Class.class  
| | | | | [other java files]  
| | test  
| | | java  
| | | | proj  
| | | | | TestClass.java  
| | | | | TestClass.class  
| | | | | [other java test files]  
| [other directories]

此外,文件Class.javaTestClass.java的开头都带有语句package proj;。显然,这意味着在编译TestClass之后,在终端中调用proj.TestClass时,我需要从父目录中将其称为java

如果我一直更加注意错误消息,我会发现java特别期待proj/TestClass。从这个answer to a separate question

  

java的参数不是文件,它是类路径(您要执行的主类)内的类的完全限定类名。

最终运行的Cygwin命令:

$ cd proj/src
$ java -cp "$CLASSPATH;main\java;test\java" org.junit.runner.JUnitCore proj.TestClass

由于我最终仍在使用Windows,所以java是Windows命令,因此-cp的参数需要格式化为Windows样式的路径列表。

我在Windows上的CLASSPATH.;%JUNIT_HOME%\junit-4.12.jar;%JUNIT_HOME%\hamcrest-core-1.3.jar