我有一个使用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插件中找到这样的标志,如果存在这样的东西,那么这也会有效。
答案 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提供基本支持。