好吧,我很沮丧!我已经四处搜寻了好几个小时,但仍然很难过。
环境: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 之外没有其他依赖项。
难倒(和沮丧)!