Java 单元测试仅在使用Ant任务从运行时失败

Java 单元测试仅在使用Ant任务从运行时失败,java,eclipse,ant,junit,Java,Eclipse,Ant,Junit,我从eclipse和Ant任务中运行相同的测试。从eclipse运行时,所有测试都通过。当我运行Ant junit任务时,单个测试失败,出现以下奇怪错误: junit.framework.AssertionFailedError 在org.eclipse.ant.internal.launching.remote.EclipseDefaultExecutor.executeTargetsEclipseDefaultExecutor.java:32 位于org.eclipse.ant.intern

我从eclipse和Ant任务中运行相同的测试。从eclipse运行时,所有测试都通过。当我运行Ant junit任务时,单个测试失败,出现以下奇怪错误:

junit.framework.AssertionFailedError 在org.eclipse.ant.internal.launching.remote.EclipseDefaultExecutor.executeTargetsEclipseDefaultExecutor.java:32 位于org.eclipse.ant.internal.launching.remote.InternalAntRunner.runInternalAntRunner.java:423 java:137 位于unitests.mypackage.MyTestClass.mytestcase未知源

原因可能是什么

我读了一些书,发现这可能是因为eclipse和Ant使用了不同版本的junit。在我的项目中,junit位于libs/junit-4.10.jar,并在eclipse的.classpath文件和junit任务类路径中引用。 您可以在此处看到Ant的任务:

<path id="classpath">
    <fileset dir="${lib.dir}" includes="**/*.jar"/>
    <fileset dir="${src.dir}" includes="**/*.jar"/>
</path>
...
<target name="run-unit-tests" depends="compile,compile-unit-tests">
    <mkdir dir="${junit.output.dir}"/>
    <junit fork="yes" printsummary="yes" haltonfailure="no">          
        <classpath>
            <path refid="classpath"/>
            <fileset dir="${unit.tests.classes.dir}" includes="**/*.class"/>
        </classpath>

        <formatter type="xml"/>
        <batchtest todir="${junit.output.dir}">
            <fileset dir="${unit.tests.dir}">
                <include name="**/*Test*.java"/>
            </fileset>
        </batchtest>
    </junit>

    <mkdir dir="${junit.report.dir}"/>
    <junitreport todir="${junit.report.dir}">
      <fileset dir="${junit.output.dir}">
        <include name="TEST-*.xml"/>
      </fileset>
      <report format="frames" todir="${junit.report.dir}/html"/>
    </junitreport>
</target>
Ant的版本是1.7.1,它与eclipse一起出现

编辑:


最终通过在junit的任务中添加fork=yes解决了这个问题。通过使用eclipse的导出选项生成构建文件,然后查看生成的文件与我的文件之间的差异,找到了它。不知道为什么分叉可以解决这个问题。

不同版本的Ant听起来像是一个可能的原因。要测试这一点,您需要Eclipse使用


将JUnit和用于在IDE之外运行测试的设置为相同版本可能也是一个好主意。

不同版本的Ant似乎是一个可能的原因。要测试这一点,您需要Eclipse使用

将JUnit和用于在IDE之外运行测试的设置为相同版本可能也是一个好主意。

当堆栈跟踪显示org.eclipse条目时,我强烈怀疑您正在通过eclipse运行ant。如果从控制台运行ant,则很可能不会出现此问题

因此,原因是Eclipse中的一个bug。这并不奇怪,Eclipse充满了bug

fork=true有帮助,因为它会导致ant生成一个新的进程来执行。这个新进程在类路径上没有任何Eclipse类。

当堆栈跟踪显示org.Eclipse条目时,我强烈怀疑您正在通过Eclipse运行ant。如果从控制台运行ant,则很可能不会出现此问题

因此,原因是Eclipse中的一个bug。这并不奇怪,Eclipse充满了bug


fork=true有帮助,因为它会导致ant生成一个新的进程来执行。这个新进程在类路径上没有任何Eclipse类。

我不明白。您是否建议安装独立Ant并使用它?我假设您已经从命令行运行构建,并在类路径上引用Ant jar,但不确定您所说的独立Ant是什么意思。既然您确定JUnit版本是相同的,那么我将检查Eclipse是否使用与类路径引用相同的Ant版本。上面的链接应该指向Eclipse的ant首选项。发现一篇文章引用了一个类似的错误,声称问题出在JUnit版本上,因此可能值得仔细检查两个版本是否使用相同的JUnit:我不明白。您是否建议安装独立Ant并使用它?我假设您已经从命令行运行构建,并在类路径上引用Ant jar,但不确定您所说的独立Ant是什么意思。既然您确定JUnit版本是相同的,那么我将检查Eclipse是否使用与类路径引用相同的Ant版本。上面的链接应该指向Eclipse的ant首选项。发现一个帖子引用了一个类似的错误,声称问题出在JUnit版本上,因此可能值得仔细检查两个版本是否使用相同的JUnit: