【发布时间】:2021-08-04 20:46:29
【问题描述】:
我正在使用 maven-surefire-plugin 和 junit 4.1.4。我有一个单元测试,它依赖于内部使用static { ... } 代码块来启动一些变量的第 3 方类。对于一项测试,我需要更改这些变量之一,但仅限于某些测试。我希望在测试之间重新执行这个块,因为它在第一次运行时会获取一个值。
在测试时,似乎 Surefire 将测试类实例化一次,因此 static { ... } 代码块永远不会再次处理。
这意味着我的单元测试更改了测试所需的值被忽略了,静态类已经被实例化了。
???? 注意:静态类使用System.loadLibrary(...),据我发现,它不能被重写以实例化,static 是(罕见但)正确用法。
我为 Spring Framework 找到了一个类似的解决方案,它使用 @DirtiesContext(...) 注释,允许程序员将类或方法标记为“脏”,以便在测试之间初始化一个新类(或在许多情况下是 JVM)。
你如何做与@DirtiesContext(...)相同的事情,但使用maven-surefire-plugin?
public class MyTests {
@Test
public void test1() {
assertThat(MyClass.THE_VALUE, is("something-default"));
}
@Test
public void test2() {
System.setProperty("foo.bar", "something-else");
assertThat(MyClass.THE_VALUE, is("something-else"));
// ^-- this assert fails
// value still "something-default"
}
}
public class MyClass {
static {
String value;
if(System.getProperty("foo.bar") != null) {
value = System.getProperty("foo.bar"); // set to "something-else"
} else {
value = "something-default";
}
}
public static String THE_VALUE = value;
}
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>4.1.2</version>
</plugin>
【问题讨论】:
-
Surefire 与它几乎没有什么关系——它是控制测试类(JUnit、JUnit5 等)生命周期的测试引擎。你可以让surefire分叉出多个JVM——但这很慢。
-
@BoristheSpider 我更新了问题以指定我正在使用 Junit 4。这有助于澄清问题吗?我可以分叉另一个 JVM,这就是实践中的做法。关于
surefire-maven-plugin与JUnit,我大多只是使用@Test注释,所以我仍然不确定如何解决静态类问题。我还添加了一个伪代码 sn-p。 -
另外,
reuseForks设置为false似乎已损坏:issues.apache.org/jira/browse/SUREFIRE-1534。 编辑: 升级到 Surefire 3.0.0-M4 解决了这个问题。 -
不幸的是碰到 Surefire 3.0.0-M4 并设置
reuseForksfalse 并不能解决这个问题,因为它是同一个测试类,它仍然失败。还有其他方法吗?
标签: java maven maven-surefire-plugin