ant junit任务的NoClassDefFoundError
另一个典型的ant junit问题。就像我在这个主题上发现的其他问题一样,这可能是一些微妙的类路径错误,但建议的解决方案都不适合我。这是我的测试代码,它在Eclipse中运行良好-- 这是我的build.xml(类文件在${workdir}\bin\trial中,源文件在${workdir}\src\trial中)--ant junit任务的NoClassDefFoundError,ant,junit,Ant,Junit,另一个典型的ant junit问题。就像我在这个主题上发现的其他问题一样,这可能是一些微妙的类路径错误,但建议的解决方案都不适合我。这是我的测试代码,它在Eclipse中运行良好-- 这是我的build.xml(类文件在${workdir}\bin\trial中,源文件在${workdir}\src\trial中)-- 因此,它找到了正确的junit测试(trial.BaseTests),但随后又声称它的名称错误。非常感谢您的建议,特别是调试提示,以便我以后可以避免此问题。看起来您的文件路径不正
因此,它找到了正确的junit测试(trial.BaseTests),但随后又声称它的名称错误。非常感谢您的建议,特别是调试提示,以便我以后可以避免此问题。看起来您的文件路径不正确。它们应该与包名匹配 您的测试类是trial.BaseTests。您告诉JUnit在bin/trial下执行所有测试。因此,它搜索bin/trial下的所有文件,并找到BaseTests.class,它应该在trial/BaseTests.class下 将您的testbin从“bin/trial”更改为“bin”:
<property name="testbin" value="bin"/>
首先,您的src dir应该是
src
,您的testbin应该是bin
。这些是包树的根
接下来,类路径应该包含jar文件和包含已编译类的目录,而不是源文件。因此junit的类路径应该包含testdir,而不是src dir
最后,即使在Windows上,您也应该使用正斜杠而不是反斜杠,并且在定义包含文件或目录路径的属性时,您还应该使用location属性而不是value属性。我在文件路径上尝试了许多变体,但都没有解决问题。我将testbin值改回普通的“bin”,它仍然声称找不到测试。有没有一种方法可以让我“呼应”junit认为它正在使用的类路径?(顺便说一句,编译任务工作正常,类文件显示在它们应该显示的位置。)Arg。我还必须将文件集include更改为**/*Tests.class。现在它很快乐。谢谢
<project default="main" basedir=".">
<property name="testbin" value="bin\trial"/>
<property name="src.dir" value="src\trial"/>
<path id="path.class">
<pathelement location="c:\Java\selenium-2.8.0" />
<pathelement location="C:\eclipse\plugins\org.junit_4.8.2.v4_8_2_v20110321-1705"/>
<pathelement location="C:\eclipse\plugins\org.apache.ant_1.8.2.v20110505-1300"/>
<fileset dir="c:\Java\selenium-2.8.0" includes="*.jar" />
<fileset dir="C:\eclipse\plugins\org.junit_4.8.2.v4_8_2_v20110321-1705" includes="*.jar"/>
<fileset dir="C:\eclipse\plugins\org.apache.ant_1.8.2.v20110505-1300\lib" includes="*.jar"/>
<path refid="src.dir" />
</path>
<path id="src.dir">
<pathelement location="${src.dir}" />
</path>
<path id="test.dir">
<pathelement location="${testbin}"/>
</path>
<target name="main" depends="compile" description="main target">
<echo> Building now </echo>
</target>
<target name="compile" description="compilation target" >
<javac srcdir="${src.dir}" destdir="${testbin}" classpathref="path.class" debug="on" verbose="true"/>
</target>
<target name="runtest" >
<junit fork="no" printsummary="true" showoutput="true">
<classpath>
<path refid="path.class"/>
<path refid="test.dir"/>
<path refid="src.dir"/>
</classpath>
<formatter type="brief" usefile="false" />
<batchtest fork="yes">
<fileset dir="${testbin}">
<include name="*Tests.class"/>
</fileset>
</batchtest>
</junit>
</target>
</project>
runtest:
[junit] Running BaseTests
[junit] Testsuite: BaseTests
[junit] Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0 sec
[junit] Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0 sec
[junit] Null Test: Caused an ERROR
[junit] BaseTests (wrong name: trial/BaseTests)
[junit] java.lang.NoClassDefFoundError: BaseTests (wrong name: trial/BaseTests)
[junit] at java.lang.ClassLoader.defineClass1(Native Method)
[junit] at java.lang.ClassLoader.defineClassCond(Unknown Source)
[junit] at java.lang.ClassLoader.defineClass(Unknown Source)
[junit] at java.security.SecureClassLoader.defineClass(Unknown Source)
[junit] at java.net.URLClassLoader.defineClass(Unknown Source)
[junit] at java.net.URLClassLoader.access$000(Unknown Source)
[junit] at java.net.URLClassLoader$1.run(Unknown Source)
[junit] at java.security.AccessController.doPrivileged(Native Method)
[junit] at java.net.URLClassLoader.findClass(Unknown Source)
[junit] at java.lang.ClassLoader.loadClass(Unknown Source)
[junit] at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
[junit] at java.lang.ClassLoader.loadClass(Unknown Source)
[junit] at java.lang.Class.forName0(Native Method)
[junit] at java.lang.Class.forName(Unknown Source)
[junit] Test BaseTests FAILED
<property name="testbin" value="bin"/>