如何使用JUnit测试依赖于环境变量的代码?

我有一段Java代码使用环境变量,代码的行为取决于此变量的值。我想使用环境变量的不同值来测试此代码。如何在 JUnit 中执行此操作?

我见过一些在Java中设置环境变量的方法,但我对它的单元测试方面更感兴趣,特别是考虑到测试不应该相互干扰。


答案 1

系统 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"));
  }
}

完全披露:我是这两个库的作者。


答案 2

通常的解决方案是创建一个类来管理对此环境变量的访问,然后您可以在测试类中模拟该变量。

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() 获取环境变量。


推荐