好的,我很沮丧!我已经狩猎了好几个小时而且仍然难倒。
环境:WinXP,Eclipse Galileo 3.5(直接安装 - 无额外插件)。
所以,我有一个简单的JUnit测试。它从内部Eclipse JUnit运行配置运行良好。这个类没有依赖任何东西。为了尽可能缩小这个问题,它只包含:
@Test
public void testX() {
assertEquals("1", new Integer(1).toString());
}
到目前为止没有汗水。现在我想采取从Ant内部运行此测试用例的超级高级步骤(最终目标是与Hudson集成)。
所以,我创建了一个build.xml:
<project name="Test" default="basic">
<property name="default.target.dir" value="${basedir}/target" />
<property name="test.report.dir" value="${default.target.dir}/test-reports" />
<target name="basic">
<mkdir dir="${test.report.dir}" />
<junit fork="true" printSummary="true" showOutput="true">
<formatter type="plain" />
<classpath>
<pathelement path="${basedir}/bin "/>
</classpath>
<batchtest fork="true" todir="${test.report.dir}" >
<fileset dir="${basedir}/bin">
<include name="**/*Test.*" />
</fileset>
</batchtest>
</junit>
</target>
</project>
$ {basedir}是工作空间中包含源,类和构建文件的Java项目名称。所有.java和build.xml都在$ {basedir} / src中。 .class文件位于$ {basedir} / bin。
我已经通过Windows / Preferences / Ant / Runtime / Contributed Entries将eclipse-install-dir / plugins / org.junit4_4.5.0.v20090423 / junit.jar添加到Ant运行时类路径中。 ant-junit.jar在Ant Home Entries。
那么,当我运行这个疯狂复杂的目标时会发生什么?我的报告文件包含:
Testsuite: com.xyz.test.RussianTest
Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0 sec
Testcase: initializationError took 0 sec
Caused an ERROR
org/hamcrest/SelfDescribing
java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.hamcrest.SelfDescribing
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
这个org.hamcrest.SelfDescribing课是什么?与嘲笑有关?好的。但为什么依赖?我根本没有做任何事情。这实际上是一个Java项目,除了JUnit之外没有依赖项。
难倒(和沮丧)!!
答案 0 :(得分:14)
我下载了JUnit 4.7并将junit-4.7.jar放在我的构建路径中(而不是旧版本)。这解决了它。我没碰到蚂蚁。
答案 1 :(得分:10)
将hamcrest.jar添加到您的测试类路径
答案 2 :(得分:7)
我找到了相同问题的原因,但只有在命令行上使用Ant运行测试时才会这样。
您可能希望以调试模式(ant -d
)运行Ant并注意此声明:
[junit] Implicitly adding /usr/share/ant/lib/junit4.jar:...
我的情况是,在运行测试时,这个JAR被添加到我的类路径的末尾,并在我的Ant脚本中覆盖了我的JUnit引用。
事实证明,我的Ant安装与一组较旧的JUnit库捆绑在一起。我不得不删除上面的junit4.jar,以使我的Ant类路径引用生效。
答案 3 :(得分:3)
在eclipse中面对完全相同的问题但是按照给定的步骤解决了它
答案 4 :(得分:2)
我遇到了同样的问题并尝试了很多方法来改变类路径。对我来说最简单的解决方案是在junit目标处使用参数fork =“no”。似乎Eclipse可以“自动”比我做得更好......
答案 5 :(得分:2)
我遇到了与jUnit 4.11,Ant和Ivy相同的问题。 这段代码对我有用,但你必须确保你的lib文件夹中有 hamcrest-core-1.3.jar(对于jUnit 4.11)。
<property name="lib.dir">lib</property>
<property name="test.dir">src/test/java</property>
<property name="build.test">build/test/java</property>
<path id="test.path.id">
<path location="${build.test}" />
<path refid="lib.path.id" />
</path>
<path id="lib.path.id">
<fileset dir="${lib.dir}" />
</path>
<!-- =================================
Runs Tests
================================= -->
<target name="junit">
<junit>
<classpath refid="test.path.id" />
<batchtest>
<fileset dir="${test.dir}" />
</batchtest>
<formatter type="plain" usefile="false" />
</junit>
</target>
答案 6 :(得分:2)
我将hamcrest和junit jar文件添加到java / lib / ext目录中,而且它对我来说还不错。
答案 7 :(得分:1)
您缺少的课程包含在版本4.4和(link)的junit中。
检查旧版本的jUnit是否在您的类路径中。尝试在命令shell中运行ant脚本以查看是否收到相同的错误。如果你这样做,那么很可能ant使用的是早于4.4的jUnit版本
<强>更新强>
查看ANT_HOME文件夹。右键单击build.xml文件,在Run As ..对话框中选择第二个“Ant build”。将打开一个用于编辑ant run配置的对话框(可能有一种更简单的方法来打开它)。转到Classpath选项卡。在类路径(ant的lib文件夹)中添加最新的junit。
答案 8 :(得分:1)
我从顶层搜索了Eclipse安装目录中的“ hamcrest .jar”(这个网络帖子中没有显示的hamcrest周围的通配符'*')。然后我将一个找到的jar文件添加到Ant build.xml中的类路径中。固定。
答案 9 :(得分:1)
我试图从Run运行junit测试时遇到此问题 - &gt;运行方式 - &gt; JUnit测试 (我检查过,我确实安装了最新的junit插件(junit4_4.5.0)。
我在eclipse安装主目录中创建了一个新目录(externalJars),在那里下载了最新的junit jar(4.8.1)。
接下来,从Eclipse中选择项目,我修改了构建路径中的jar文件(Project - &gt; Properties - &gt; Java Build Path)。当我第一次尝试junit时,我从插件/ org.junit4_4.5.0.v20090824文件夹中添加了junit jar文件。我删除了这个jar文件,然后通过单击“Add External Jars”按钮将externalJars / junit-4.8.1.jar(我刚下载的那个)添加到构建路径。
hamcrest.org是一个“匹配器”库。您可以在以下网址找到信息:
http://code.google.com/p/hamcrest/
提供一个matcher对象库(也称为约束或谓词),允许以声明方式定义“匹配”规则,以便在其他框架中使用。典型的场景包括测试框架,模拟库和UI验证规则。
Hamcrest已移植到Java,C ++,Objective-C,Python和PhP。
注意:Hamcrest它不是一个测试库:只是匹配器对测试非常有用。
答案 10 :(得分:0)
JUnit 4.5包含Hamcrest作为其匹配系统的一部分。你也想确保你的类路径上也有这个JAR文件
答案 11 :(得分:0)
我认为不需要将JUnit jar添加到Ant类路径中。相反,请检查Java Build Path中是否有JUnit库(Windows / Preferences / Java / Build Path / Classpath Variables)。
答案 12 :(得分:0)
行。我终于解决了这个问题。我不会说“已解决”,因为我仍然对发生了什么感到困惑。总之...
我下载了最新的Ant(1.7.1)和JUnit(4.6)并将它们分解到一个外部目录中 - 不是在工作区中或以任何方式“在”Eclipse中。
然后我转到Windows / Preferences / Ant / Runtime / Classpath / Ant Home Entries并杀死所有现有(默认)值。我用新下载的Ant lib目录的内容替换它们。
然后我在全局条目中添加了下载的junit.jar。它包含org.hamcrest类,就像Eclipse中包含的junit.jar一样,所以我不知道为什么这是必要的,但确实如此。
就是这样。我在构建文件中的junit任务非常有效。
答案 13 :(得分:0)
在eclipse中,当您使用Properties->Libaries->Add External JARs...
而不是使用允许您选择Properties->Libaries->Add Library...
的{{1}}和自动将hamcrest库添加到路径中。
答案 14 :(得分:0)
我遇到了类似的问题,我在