我有两个测试,我们将其称为测试A和测试B。
在测试A中,我们有这行
System.setProperty("<interface>", "<implementation>);
在测试B中,我们有同一行。
当两行同时存在时,测试B失败。当我注释掉测试A中的行时,测试B成功。如果我做
System.clearProperty("<interface>")
测试B失败。
对于具有不同接口属性的测试C和D,我也遇到类似的问题。测试C设置了它,测试D没有设置它。当我注释掉设置呼叫时,D通过。当我不这样做时。 D失败。当我打电话给clear时,D失败了。
调用clear并注释掉该行会导致B和D在该系统属性中具有“正确”的值,但是当我调用clear时它们会失败(尽管与注释掉该行具有相同的值)并成功评论时。任何人都知道为什么会这样吗?
显示其功能的摘录
System.setProperty("INTERFACE_NAME", "IMPLEMENTATION_NAME");
//getOBJECT will now return a type of IMPLEMENTATION_NAME
INTERFACE mockedINTERFACE = INTERFACE.getDirectory().getOBJECT(domain);
答案 0 :(得分:2)
测试应该相互独立。如果它们改变全局状态,例如系统属性,它们应该在执行测试后还原更改。
确保每个测试分别运行时通过,然后添加verify
和@Before
方法以将更改恢复为全局状态。
@After
请注意,默认情况下未设置属性很棘手,可以使用private String oldValue;
@Before
public void setUp() {
oldValue = System.getProperty("key");
System.setProperty("key", ...);
}
@After
public void tearDown() {
if (oldValue != null) {
System.setProperty("key", oldValue);
}
}
。
答案 1 :(得分:0)
答案是两个部分,两个部分都不好。
通过将PowerMock添加到测试A和C中,我能够使整个测试套件运行大约20%的时间。测试B和D已经在使用它。这使我认为PowerMock某种程度上是造成此问题的根本原因。我们还不能将其从项目中剔除,但是它已经存在于我们的待办事项清单中大约一年了。
我撤消了PowerMock的更改,因为20%不足以实际表明它在起作用。相反,我最终将maven surefire的forkmode更改为pertest,并且让每个测试在单独的JVM中运行允许所有测试运行并通过maven。
我讨厌所有这些,但是从技术上讲它是可行的。祝你好运,如果有人偶然发现了这个问题。