如何使用Ant在JUnit3测试类上运行自定义JUnit4运行程序?

如何使用Ant在JUnit3测试类上运行自定义JUnit4运行程序?,ant,junit,junit4,Ant,Junit,Junit4,我们有基于Spring2.0.8的AbstractTransactionalDataSourceSpringContextTests构建的测试类。其中有很多,都是用JUnit3风格编写的 为了使用JUnit4过滤,我们设计了一个替代的JUnit38Runner,它允许我们将这些测试与特定的应用程序环境相匹配,并相应地过滤掉它们 通过在我们定制的JUnit38Runner上使用@RunWith注释,整个测试套件在Ant之外运行良好 但是,当我们尝试在Ant中运行时,它会强制单个测试以junit.f

我们有基于Spring2.0.8的AbstractTransactionalDataSourceSpringContextTests构建的测试类。其中有很多,都是用JUnit3风格编写的

为了使用JUnit4过滤,我们设计了一个替代的JUnit38Runner,它允许我们将这些测试与特定的应用程序环境相匹配,并相应地过滤掉它们

通过在我们定制的JUnit38Runner上使用@RunWith注释,整个测试套件在Ant之外运行良好

但是,当我们尝试在Ant中运行时,它会强制单个测试以junit.framework.TestSuite或包装在JUnit4TestAdapter中运行,两者都会忽略JUnit4下的@RunWith注释。更糟糕的是,我们现有的套件被Ant显式覆盖,它直接调用suite()方法,而不是委托给JUnit

我尝试从Ant JUnitTestRunner进行扩展,并简单地重写run()方法,但是该类并不是为扩展而编写的


除了复制整个JUnitTestRunner并对其进行黑客攻击(这将使我们面临脆弱的代码问题),有没有人有幸用其他方法来解决这个问题?

我们也遇到了类似的问题,尽管它没有运行junit任务那么干净,但解决起来并不十分困难。我们创建了一个带有main()的类,该类只调用Junit4Runner。它添加了一个RunListener,尝试用XML写出junit报告输出。其想法是,数据格式比运行程序更不可能改变,因此不那么脆弱

我已经剥离了大量特定于环境的代码,但这是基本思想。ant中的
测试目标如下所示:

    <java failonerror="yes"
          fork="true"
          classname="com.mycompany.test.Junit4Runner">
        <classpath>
            <pathelement location="${basedir}/bin" />
            <pathelement path="${ProjectTest.classpath}" />
            <!-- above classpath includes junit-4.8.1.jar -->
        </classpath>
        <arg value="${test.class}" />
    </java>


. 它不依赖于Java 6 SE和Junit 4.8之外的任何东西,并且可能与Java 5 SE兼容。

这里似乎有一些代码味道。我知道这可能不是你想要的答案,但也许是时候重构你的测试用例了。重构不会解决Ant的问题(在JUnit3中包装JUnit4测试)。由于有许多变通方法,这一过程步履蹒跚,但我想我将不得不咬紧牙关,在最近的某一天编写一个JUnit4 Ant任务。也许[升级到JUnit4并通过一起运行来保留遗留的JUnit 3测试和测试套件][1]中有一个答案?[1] :@TheNail这是我们不得不使用的不幸的解决方法-自定义套件运行程序,并删除我们所有的旧测试套件。你不能只移植它们而不是删除它们吗?这看起来可能有效,尽管我会让你在我的商店中提交之前更改p_和m_;-)。不幸的是,我现在没有时间去测试它,但我会把它标记为已经解决了。p_u和m_u是我们的风格选择——我想我已经习惯了:)