如何使用JUnit测试依赖于环境变量的代码?
2022-08-31 06:26:57
我有一段Java代码使用环境变量,代码的行为取决于此变量的值。我想使用环境变量的不同值来测试此代码。如何在 JUnit 中执行此操作?
我见过一些在Java中设置环境变量的方法,但我对它的单元测试方面更感兴趣,特别是考虑到测试不应该相互干扰。
我有一段Java代码使用环境变量,代码的行为取决于此变量的值。我想使用环境变量的不同值来测试此代码。如何在 JUnit 中执行此操作?
我见过一些在Java中设置环境变量的方法,但我对它的单元测试方面更感兴趣,特别是考虑到测试不应该相互干扰。
库系统 Lambda 具有用于设置环境变量的方法。withEnvironmentVariables
import static com.github.stefanbirkner.systemlambda.SystemLambda.*;
public void EnvironmentVariablesTest {
@Test
public void setEnvironmentVariable() {
String value = withEnvironmentVariable("name", "value")
.execute(() -> System.getenv("name"));
assertEquals("value", value);
}
}
对于 Java 5 到 7,库系统规则有一个名为 的 JUnit 规则。EnvironmentVariables
import org.junit.contrib.java.lang.system.EnvironmentVariables;
public class EnvironmentVariablesTest {
@Rule
public final EnvironmentVariables environmentVariables
= new EnvironmentVariables();
@Test
public void setEnvironmentVariable() {
environmentVariables.set("name", "value");
assertEquals("value", System.getenv("name"));
}
}
完全披露:我是这两个库的作者。
通常的解决方案是创建一个类来管理对此环境变量的访问,然后您可以在测试类中模拟该变量。
public class Environment {
public String getVariable() {
return System.getenv(); // or whatever
}
}
public class ServiceTest {
private static class MockEnvironment {
public String getVariable() {
return "foobar";
}
}
@Test public void testService() {
service.doSomething(new MockEnvironment());
}
}
然后,被测试的类使用环境类获取环境变量,而不是直接从 System.getenv() 获取环境变量。