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

时间:2011-04-20 00:52:57

标签: ant junit junit4

我们有基于Spring 2.0.8的AbstractTransactionalDataSourceSpringContextTests构建的测试类。这些都是大量的,所有这些都是用JUnit3风格编写的。

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

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

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

我试图从Ant JUnitTestRunner扩展,并简单地覆盖run()方法,但是该类不是为扩展而编写的。

除了复制整个JUnitTestRunner并进行黑客攻击(这会让我们解决脆弱的代码问题)之外,有没有人有其他解决这个问题的方法呢?

1 个答案:

答案 0 :(得分:0)

我们遇到了类似的问题,尽管它不像运行junit任务一样干净,但解决起来并不是非常困难。我们用main()创建了一个只调用Junit4Runner的类。它添加了一个RunListener,它试图用XML写出junit报告输出。这个想法是数据格式比跑步者更不可能改变,所以它不那么脆弱。

我已经删除了大量特定于环境的代码,但这是基本的想法。我们在ant中的test目标看起来像这样:

    <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>

您可以查看跑步者班级here的代码。它不依赖于Java 6 SE和Junit 4.8之外的任何东西,它可能与Java 5 SE兼容。