【问题标题】:How can I run a custom JUnit4 Runner on JUnit3 test classes with Ant?如何使用 Ant 在 JUnit3 测试类上运行自定义 JUnit4 Runner?
【发布时间】:2011-04-20 00:52:56
【问题描述】:

我们有基于 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 并对其进行破解(这将使我们面临脆弱的代码问题)之外,有没有人用其他方法来解决这个问题?

【问题讨论】:

  • 这里似乎有一些代码气味。我知道这可能不是您要寻找的答案,但可能是时候重构您的测试用例了。
  • 重构不会解决 Ant 的问题(在 Junit 3 中包装 JUnit 4 测试)。有许多变通方法,它一直磕磕绊绊,但我想我将不得不硬着头皮写一个 JUnit4 Ant 任务。
  • 也许在 [升级到 JUnit4 并通过一起运行旧的 JUnit 3 测试和测试套件][1] 中有一个答案? [1]:stackoverflow.com/questions/1861875/…
  • @TheNail 这是我们不得不使用的不幸的解决方法 - 自定义套件运行器,并删除我们所有的旧测试套件。
  • 你不能直接移植而不是删除吗?

标签: ant junit junit4


【解决方案1】:

我们也遇到过类似的问题,虽然没有运行 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 兼容。

【讨论】:

  • 看起来它可能会起作用,尽管我会让你在提交之前更改 p_ 和 m_ ;-)。不幸的是,现在没有时间测试它,但我会暂时将其标记为已解决。
  • p_ 和 m_ 是我们的风格选择 - 我想我已经习惯了 :)
猜你喜欢
  • 1970-01-01
  • 2019-06-06
  • 1970-01-01
  • 2013-10-11
  • 2011-01-20
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多