【问题标题】:Classloading issues in maven2 with JUnit使用 JUnit 的 maven2 中的类加载问题
【发布时间】:2009-08-25 23:52:27
【问题描述】:

我有一个使用 maven2 构建并针对代码运行一系列 JUnit 测试用例的项目。到目前为止,这一直运行良好,我现在有 2 个测试必须按特定顺序运行才能正常工作,比如说 TestA 和 Test(A 然后 B)。不幸的是,maven2 不明白这一点,所以我正在寻找一种方法来说服它需要按此顺序运行测试。

问题是我在 TestB 中设置了一些最终的静态字段,但我是从 TestA 执行此操作的,它本身使用这些字段,并且测试的成功执行取决于这些字段设置为它们的新值(绝对没有办法,否则我早就走这条路了)。因此,必须首先加载 TestA,并且在尝试访问它时当然会导致加载 TestB。但是,maven2 已经决定先运行 TestB 然后运行 ​​TestA,这意味着这些最终字段已经设置并且无法更改。

所以我正在寻找的是一种方法来指定测试执行的顺序(A 然后 B,每次),或者是一种容易使 TestB 被 JUnit 使用的任何类加载器重新加载的方法。

EDIT - 另一个选项可能是像旧的 JUnit GUI 工具那样的选项,它会导致为每个测试重新加载所有类。我看了又看,没有在maven junit插件中找到这样的标志,如果存在这样的东西,那也可以。

【问题讨论】:

    标签: maven-2 junit


    【解决方案1】:

    Fork mode 可以强制每个测试在其自己的 JVM 中运行,以便为每个测试重新加载每个类。

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <forkMode>pertest</forkMode>
        </configuration>
      </plugin>
    

    【讨论】:

      【解决方案2】:

      故意未定义 JUnit 中的测试顺序,这不是 Maven 问题,您的测试到目前为止运行正常可能只是运气。

      Sal 的回答直接解决了您的问题,但是在每个测试中分叉 JVM 以获得大量测试计数会大大增加您的构建时间。

      另一种方法是使用 PowerMock 之类的测试库(它目前与 EasyMock 和 Mockito 一起使用)来清除 TestB 初始化中的静态字段,这避免了任何 JVM 分叉的需要,并确保您的测试是便携。

      来自 PowerMock 网站:

      PowerMock 是一个框架,它以更强大的功能扩展了 EasyMock 等其他模拟库。 PowerMock 使用自定义类加载器和字节码操作来模拟静态方法、构造函数、最终类和方法、私有方法、删除静态初始化程序等。通过使用自定义类加载器,无需对 IDE 或持续集成服务器进行任何更改,从而简化了采用。熟悉 EasyMock 的开发人员会发现 PowerMock 易于使用,因为整个期望 API 是相同的,无论是静态方法还是构造函数。 PowerMock 使用少量方法和注释扩展了 EasyMock API,以启用额外的功能。从 1.1 版开始,PowerMock 还对 Mockito 提供了基本支持。

      【讨论】:

      • @rich,关于分叉的潜在性能问题,您是对的。假设两个测试; A 和 B,放缓可能很小。
      • @sal 同意,如果测试数量很少,则开销最小,您的答案可以解决问题。我不会引入新的测试框架来解决单个问题,但如果有多个实例,则值得考虑。我以为我当时赞成你的回答,现在我会更正一下
      • 在 maven 中使用 pertest 选项是我最终找到的解决方案,但我喜欢使用您提到的库的想法。我会看看。当我之前得出这个结论时,我担心性能/构建时间开销,是的,有超过 2 个测试。这两个恰好是唯一重要的顺序。
      猜你喜欢
      • 1970-01-01
      • 2014-09-23
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 2016-04-27
      • 2011-08-02
      相关资源
      最近更新 更多