使用JUnit在maven2中加载问题

时间:2009-08-25 23:52:28

标签: maven-2 junit

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

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

所以我正在寻找的是指定执行测试的顺序(A然后是B,每次),或者通过JUnit使用的任何类加载器轻松地重新加载TestB的方法。

编辑 - 另一个选项可能是旧的JUnit GUI工具所具有的一些选项,它会导致为每个测试重新加载所有类。我看起来并且看起来并没有在maven junit插件中找到这样的标志,如果存在这样的东西,那么这也会有效。

2 个答案:

答案 0 :(得分:4)

Fork mode可以强制每个测试在自己的JVM中运行,因此每个测试都会重新加载每个类。

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

答案 1 :(得分:1)

JUnit中的测试顺序是故意未定义的,这不是Maven问题,直到现在你的测试运行可能只是好运。

Sal的答案直接解决了您的问题,但是在每次测试中为大型测试计数分配JVM会大大增加您的构建时间。

另一种方法是使用测试库,例如PowerMock(目前可与EasyMock和Mockito一起使用)清除TestB初始化中的静态字段,这样就无需任何JVM分支,并确保您的测试是便携式的。

来自PowerMock网站:

  

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