JUnit 测试中的 System.setProperty

Nea*_*eal 3 java testing junit

我有两个测试,我们称它们为测试 A 和测试 B。

在测试 A 中,我们有这条线

System.setProperty("<interface>", "<implementation>);
Run Code Online (Sandbox Code Playgroud)

在测试 B 中,我们有相同的线路。

当两条线都存在时,测试 B 失败。当我注释掉测试 A 中的行时,测试 B 成功。如果我做一个

System.clearProperty("<interface>") 
Run Code Online (Sandbox Code Playgroud)

测试 B 失败。

我对具有不同接口属性的测试 C 和 D 有类似的问题。测试 C 设置它,测试 D 没有。当我注释掉 set 调用时,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);
Run Code Online (Sandbox Code Playgroud)

Kar*_*cki 6

测试应该是相互独立的。如果他们改变了全局状态,例如系统属性,他们应该在测试执行后恢复改变。

确保您的每个测试在单独运行时都通过,然后添加@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);
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,默认情况下未设置的属性很棘手,也许使用Optional<String>.