26

好吧,我很沮丧!我已经四处搜寻了好几个小时,但仍然很难过。

环境: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 Runtime Classpath 中。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.SelfDescribeing 类是什么?和mock有关系吗?好的。但是为什么依赖呢?我什么也没做。这实际上是一个 Java 项目,除了 JUnit 之外没有其他依赖项。

难倒(和沮丧)!

4

15 回答 15

14

我下载了 JUnit 4.7 并将 junit-4.7.jar 放在我的构建路径中(而不是旧版本)。那解决了它。我没有碰蚂蚁。

于 2009-09-20T19:22:25.990 回答
9

还将 hamcrest.jar 添加到您的测试类路径中

于 2009-07-23T11:59:25.847 回答
8

我找到了相同问题的原因,但仅在命令行上使用 Ant 运行测试时。

您可能希望在调试模式 ( ant -d) 下运行 Ant 并注意以下语句:

[junit] Implicitly adding /usr/share/ant/lib/junit4.jar:...

我的情况是,这个 JAR 在运行测试时被添加到我的类路径的末尾,并在我的 Ant 脚本中覆盖了我的 JUnit 引用。

事实证明,我的 Ant 安装与一组较旧的 JUnit 库捆绑在一起。我必须删除上面的 junit4.jar 才能使我的 Ant 类路径引用生效。

于 2010-06-14T11:24:28.713 回答
3

在eclipse中遇到完全相同的问题,但按照给定的步骤解决了它

  1. 转到首选项 | 爪哇 | JUnit
  2. 单击“添加包”并添加“org.hamcrest.*”

瞧……问题消失了……

于 2012-02-03T21:00:32.273 回答
2

我将 hamcrest 和 junit jar 文件添加到 java/lib/ext 目录,这对我来说效果很好。

于 2013-08-12T13:05:10.737 回答
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>
于 2013-06-21T11:45:31.027 回答
2

我有同样的问题,并尝试了很多方法来改变类路径。对我来说最简单的解决方案是在 junit 目标上使用参数 fork="no"。似乎 Eclipse 可以“自动”比我做得更好......

于 2009-08-23T15:24:22.620 回答
1

您缺少的课程包含在 4.4 版及更高版本的 junit 中(链接)。

检查旧版本的 jUnit 是否在您的类路径中。尝试在命令 shell 中运行 ant 脚本,看看是否遇到相同的错误。如果你这样做了,那么可能 ant 使用的 jUnit 版本早于 4.4

更新:

查看 ANT_HOME 文件夹。右键单击 build.xml 文件,在 Run As.. 对话框中选择第二个“Ant build”。将打开一个用于编辑 ant 运行配置的对话框(可能有更简单的方法可以打开它)。转到类路径选项卡。在类路径(ant 的 lib 文件夹)中添加最新的 junit。

于 2009-07-23T12:03:46.693 回答
1

我在尝试从 Run -> Run As -> JUnit Test 运行 junit 测试时遇到了这个问题(我检查过,我确实安装了最新的 junit 插件(junit4_4.5.0))。

我在eclipse安装主目录中新建了一个目录(externalJars),在那里下载了最新的junit jar(4.8.1)。

接下来,在选择项目的 Eclipse 中,我修改了构建路径中的 jar 文件(项目 --> 属性 --> Java 构建路径)。当我第一次尝试 junit 时,我从 plugin/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/

提供一个匹配器对象库(也称为约束或谓词),允许以声明方式定义“匹配”规则,以便在其他框架中使用。典型场景包括测试框架、模拟库和 UI 验证规则。

Hamcrest 已被移植到 Java、C++、Objective-C、Python 和 PhP。

注意:Hamcrest 它不是一个测试库:碰巧匹配器对测试非常有用。

于 2010-02-04T15:17:07.190 回答
1

我从顶层搜索 Eclipse 安装目录以查找“ hamcrest .jar”(hamcrest 周围的通配符 '*' 未显示在此网络帖子中)。然后,我将找到的 jar 文件添加到 Ant build.xml 中的类路径中。固定的。

于 2009-11-12T17:03:28.387 回答
0

JUnit 4.5 包括 Hamcrest 作为其匹配系统的一部分。您需要确保您的类路径中也有该 JAR 文件

于 2009-07-23T11:59:59.387 回答
0

我认为不需要将 JUnit jar 添加到您的 Ant 类路径中。相反,请检查 Java 构建路径(Windows/Preferences/Java/Build Path/Classpath 变量)中是否有 JUnit 库。

于 2009-07-23T12:38:00.927 回答
0

在 Eclipse 中,当您使用Properties->Libaries->Add External JARs...

而不是使用Properties->Libaries->Add Library...which 允许您选择Junit3 or Junit4自动将 hamcrest 库添加到路径中。

于 2013-07-05T17:32:55.757 回答
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 任务完美运行。

于 2009-07-23T15:20:12.310 回答
0

我有一个类似的问题,我通过在 \lib 文件夹下放置“hamcrest-core-1.3.jar”的副本来克服。

于 2013-12-23T04:56:24.310 回答