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

新手上路,请多包涵

我有一段使用环境变量的 Java 代码,代码的行为取决于该变量的值。我想用不同的环境变量值测试这段代码。我怎样才能在 JUnit 中做到这一点?

我已经看到了一般 在 Java 中设置环境变量的一些方法,但我对它的单元测试方面更感兴趣,尤其是考虑到测试不应相互干扰。

原文由 vitaut 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

系统 Lambda 库有一个方法 withEnvironmentVariable 用于设置环境变量。

 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, 系统规则 库有一个名为 EnvironmentVariables 的 JUnit 规则。

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

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

原文由 Stefan Birkner 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

 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 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题