JUnit测试中的System.setProperty

时间:2019-01-03 15:35:57

标签: java testing junit

我有两个测试,我们将其称为测试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);

2 个答案:

答案 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。

我讨厌所有这些,但是从技术上讲它是可行的。祝你好运,如果有人偶然发现了这个问题。