首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用JUnit测试依赖于环境变量的代码?

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

Stack Overflow用户
提问于 2011-11-17 22:36:20
回答 13查看 198.9K关注 0票数 178

我有一段Java代码,它使用了一个环境变量,代码的行为取决于这个变量的值。我想用不同的环境变量值来测试这段代码。我如何在JUnit中做到这一点?

我大体上看过some ways to set environment variables in Java,但我对它的单元测试方面更感兴趣,特别是考虑到测试不应该相互干扰。

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2016-02-14 23:42:54

System Lambda有一个用于设置环境变量的方法withEnvironmentVariables

代码语言:javascript
运行
复制
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);
  }
}

对于Java5到7,库System Rules有一个名为EnvironmentVariables的JUnit规则。

代码语言:javascript
运行
复制
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"));
  }
}

完全公开:我是这两个库的作者。

票数 239
EN

Stack Overflow用户

发布于 2011-11-17 22:44:03

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

代码语言:javascript
运行
复制
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()获取。

票数 113
EN

Stack Overflow用户

发布于 2015-06-24 22:54:32

我认为最干净的方法是使用Mockito.spy()。这比创建一个单独的类来模拟和传递要轻量级一些。

将您的环境变量获取移动到另一个方法:

代码语言:javascript
运行
复制
@VisibleForTesting
String getEnvironmentVariable(String envVar) {
    return System.getenv(envVar);
}

现在,在您的单元测试中执行以下操作:

代码语言:javascript
运行
复制
@Test
public void test() {
    ClassToTest classToTest = new ClassToTest();
    ClassToTest classToTestSpy = Mockito.spy(classToTest);
    Mockito.when(classToTestSpy.getEnvironmentVariable("key")).thenReturn("value");
    // Now test the method that uses getEnvironmentVariable
    assertEquals("changedvalue", classToTestSpy.methodToTest());
}
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8168884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档