Maven 2 使用JUnit的maven2中的类加载问题

Maven 2 使用JUnit的maven2中的类加载问题,maven-2,junit,Maven 2,Junit,我有一个使用maven2构建的项目,并针对代码运行一系列JUnit测试用例。到目前为止,这一切都很顺利,我现在有两个测试,它们必须按照一定的顺序运行,才能正常工作,比如TestA和Test(a然后B)。不幸的是,maven2不理解这一点,所以我正在寻找一种方法来说服它,它需要按照这个顺序运行测试 问题是,我在TestB中设置了一些最终的静态字段,但我是在TestA中这样做的,TestA本身使用这些字段,测试的成功执行取决于这些字段被设置为它们的新值(这是绝对没有办法的,否则我早就走这条路了)。因

我有一个使用maven2构建的项目,并针对代码运行一系列JUnit测试用例。到目前为止,这一切都很顺利,我现在有两个测试,它们必须按照一定的顺序运行,才能正常工作,比如TestA和Test(a然后B)。不幸的是,maven2不理解这一点,所以我正在寻找一种方法来说服它,它需要按照这个顺序运行测试

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

因此,我要寻找的要么是一种指定测试执行顺序的方法(每次都是a然后B),要么是一种容易地让JUnit使用的任何类加载器重新加载TestB的方法

编辑-另一个选项可能是类似于旧JUnitGUI工具的选项,它会导致为每个测试重新加载所有类。我在maven junit插件中查看了很多次,没有发现这样的标志,如果存在这样的标志,那么它也会起作用。

可以强制每个测试在自己的JVM中运行,这样每个测试都会重新加载每个类

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

org.apache.maven.plugins
maven surefire插件
乖巧的

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

Sal的回答直接解决了您的问题,但是,在每个测试中为大量测试分配JVM会极大地增加构建时间

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

从PowerMock网站:

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


@rich,关于分叉的潜在性能问题,您是对的。假设两次试验;“A&B,减速可能很小。”萨尔同意,如果测试的数量很小,开销就很小,你的答案解决了问题。我不会介绍一个新的测试框架来解决一个问题,但是如果有多个实例,它是值得考虑的。我当时还以为我对你的答案投了赞成票,现在我要纠正的是,在maven中使用pertest选项是我最终找到的解决方案,但是我喜欢使用你提到的库的想法。我来看看。当我之前得出这个结论时,我担心性能/构建时间开销,是的,有两个以上的测试。这两个正好是唯一一个顺序重要的。