如何使用JUnit测试依赖于环境变量的代码?
我有一段使用环境变量的Java代码,代码的行为取决于此变量的值。 我想用环境变量的不同值测试此代码。 我怎么能在JUnit中这样做?
我已经看到了一些在Java中设置环境变量的方法,但是我对它的单元测试方面更感兴趣,特别是考虑到测试不应该相互干扰。
11个解决方案
92 votes
库系统规则提供了用于设置环境变量的JUnit规则。
import org.junit.contrib.java.lang.system.EnvironmentVariables;
public void EnvironmentVariablesTest {
@Rule
public final EnvironmentVariables environmentVariables
= new EnvironmentVariables();
@Test
public void setEnvironmentVariable() {
environmentVariables.set("name", "value");
assertEquals("value", System.getenv("name"));
}
}
免责声明:我是系统规则的作者。
Stefan Birkner answered 2019-04-29T22:49:38Z
55 votes
通常的解决方案是创建一个管理对此环境变量的访问的类,然后可以在测试类中进行模拟。
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());
}
}
然后,受测试的类使用Environment类获取环境变量,而不是直接从System.getenv()获取。
Matthew Farwell answered 2019-04-29T22:49:09Z
9 votes
在类似的情况下,我必须编写依赖于环境变量的测试用例,我尝试了以下方法:
我按照Stefan Bir