运行junit测试时找不到.class文件
以下是为NetBean IDE创建的Java程序的目录结构:
$ ls build.xml manifest.mf nbproject src test
src/steal/MMThread.java
的package
语句是
package steal;
我编译.java文件
$ javac src/steal/MMThread.java -d bin/steal/ $ ls bin/steal/ MMThread.class MMThread$Worker.class
然后我编译并运行了Java Junit测试程序。 编译很好,但运行测试不是。 那我该怎么办? 谢谢
$ javac -cp bin/:/home/t/program_files/programming/eclipse/plugins/org.junit_4.11.0.v201303080030/junit.jar test/steal/MMThreadTest.java $ ls test/steal/ MMThreadTest.class MMThreadTest.java $ java -cp bin/:/home/t/program_files/programming/eclipse/plugins/org.junit_4.11.0.v201303080030/junit.jar org.junit.runner.JUnitCore steal.MMThreadTest JUnit version 4.11 Could not find class: steal.MMThreadTest Exception in thread "main" java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:996) at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:173) at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:772) at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:670) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:593) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:551) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:486) at org.junit.runner.Computer.getSuite(Computer.java:28) at org.junit.runner.Request.classes(Request.java:75) at org.junit.runner.JUnitCore.run(JUnitCore.java:117) at org.junit.runner.JUnitCore.runMain(JUnitCore.java:96) at org.junit.runner.JUnitCore.runMainAndExit(JUnitCore.java:47) at org.junit.runner.JUnitCore.main(JUnitCore.java:40) Caused by: java.lang.ClassNotFoundException: org.hamcrest.SelfDescribing at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:553) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:486) ... 15 more
更新
$ java -cp test/:bin/:/home/t/program_files/programming/eclipse/plugins/org.junit_4.11.0.v201303080030/junit.jar org.junit.runner.JUnitCore steal.MMThreadTest JUnit version 4.11 Exception in thread "main" java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:996) at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:173) at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:772) at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:670) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:593) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:551) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:486) at org.junit.runner.Computer.getSuite(Computer.java:28) at org.junit.runner.Request.classes(Request.java:75) at org.junit.runner.JUnitCore.run(JUnitCore.java:117) at org.junit.runner.JUnitCore.runMain(JUnitCore.java:96) at org.junit.runner.JUnitCore.runMainAndExit(JUnitCore.java:47) at org.junit.runner.JUnitCore.main(JUnitCore.java:40) Caused by: java.lang.ClassNotFoundException: org.hamcrest.SelfDescribing at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:553) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:486) ... 15 more
类路径设置不正确。 它需要有:
- JUnit的
- hamcrest(junit的依赖)
- 包含
.class
文件的文件夹的路径
hamcrest的jar应该在你有junit的同一个目录中。 查看/home/t/program_files/programming/eclipse/plugins
。 您可以使用find
命令找到它:
find /home/t/program_files/programming/eclipse/plugins -name '*hamcrest*.jar'
如果您的机器没有hamcrest,您可以从这里下载:
http://search.maven.org/remotecontent?filepath=org/hamcrest/hamcrest-all/1.3/hamcrest-all-1.3.jar
一旦你有了,你可以把各个部分放在一起:
junit=/home/t/program_files/programming/eclipse/plugins/org.junit_4.11.0.v201303080030/junit.jar hamcrest=/home/t/program_files/programming/eclipse/plugins/idontknowwhere/hamcrest.jar java -cp "$junit:$hamcrest:test/steal" org.junit.runner.JUnitCore MMThreadTest
问题不在于克里斯特。
此代码使用Junit 3.8.2,您在类路径中提供Junit 4。 所以删除4并添加Junit 3.8.2