之前,我下载了junit-4.12.jar
和hamcrest-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
测试的原始类的目录,但是像其他所有内容一样,它没有用。任何进一步的帮助将不胜感激,因为我现在完全不知所措。
答案 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.java
和TestClass.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