【问题标题】:how to set the environment variables in junit 5 for test case如何在junit 5中为测试用例设置环境变量
【发布时间】:2019-07-04 12:46:14
【问题描述】:

我正在研究 Junit5 。我的 java 代码使用 System.getenv("demoVar") 来访问 environment variable 。那么如何在 jUnit5 测试类中设置这个环境变量,以便我的代码在测试过程中可以访问这个环境变量的值。

【问题讨论】:

  • 为什么它被标记为重复?重复问题中的答案是关于 Java 系统属性。这个是关于环境变量的。 System.getenv 与 System.getProperty 完全不同。尝试使用 System.setEnv("", "") ! :) 所以这个回答对于这个问题是无效的。正确的响应应该是 JUnit5 中系统规则的替代方案
  • 这显然不是@angelcervera 提到的重复
  • 使用 Java 8,您可以更改调用 System.getenv() 的方法,以便它使用 Function 。在您的生产代码中,您将使用 System::getenv,在您的测试代码中,您可以在您填充了测试值的内部映射上使用 Map::get。

标签: java junit5


【解决方案1】:

来自其他 SO 答案https://stackoverflow.com/a/59635733/2185719

有 JUnit Pioneer,一个“JUnit 5 扩展包”。

jUnit Pioneer 提供了一个为测试设置环境变量的注解。例如:

@Test
@SetEnvironmentVariable(key = "PATH", value = "")
void testPath_isEmpty() {
    assertThat(System.getenv("PATH")).isEmpty();
}

【讨论】:

    【解决方案2】:

    您不能在实际的 java 进程中,因为这些使用 getenv 的环境值是不可变的

    一种方法是启动另一个虚拟机或另一个进程,您可以在其中引入新的环境值。

    另一种方法是切换到 System.getProperty,但请确保您了解其中的区别。

    https://www.baeldung.com/java-system-get-property-vs-system-getenv

    这是一个小测试代码:

    public class EnvironmentVarsTest {
        private static int counter = 0;
    
        @BeforeEach
        public void setUp() {
            counter = counter + 1;
            System.setProperty("simple_test_env_property", String.valueOf(counter));
        }
    
        @Test
        public void testFirst() {
            printOutValues();
        }
    
        @Test
        public void testSecond() {
            printOutValues();
        }
    
        private void printOutValues() {
            System.out.println("--------------------");
            System.out.println("val=" + counter);
            System.out.println("envval=" + System.getProperty("simple_test_env_property"));
        }
    
    }
    

    【讨论】:

    • 有一个hack 可以让您从Java 代码为当前进程设置环境变量。它不漂亮,除非你真的需要它,否则你不应该使用它。另一方面,Java 确实应该有一个适当的方法来做到这一点,而无需求助于 hack。
    • 注意:有些库可以让您轻松完成此操作。但是,从 Java 16 开始,反射黑客不再起作用。 github.com/webcompere/system-stubs 有一个基于 mockito 的解决方案,它确实有效。
    【解决方案3】:

    这可以通过https://github.com/webcompere/system-stubs/tree/master/system-stubs-jupiter实现

    
    @ExtendWith(SystemStubsExtension.class)
    class TestClass {
    
        @SystemStub
        private EnvironmentVariables environmentVariables =
            new EnvironmentVariables("demoVar", "val");
    
        @Test
        void test() {
            // can use the environment
            assertThat(System.getenv("demoVar")).isEqualTo("val");
    
            // can also change the environment
            environmentVariables.set("foo", "bar");
    
            // environment variables restored to previous state when
            // test ends
        }
    }
    

    【讨论】:

      【解决方案4】:

      通常的做法是使用系统属性而不是环境变量。 在这种情况下,您将使用选项 -D demoVar="{your_value}" 运行 java/maven/gradle 命令或用于运行测试的任何命令。 对于 Maven 目标:

       maven clean install -DdemoVar="test"
      

      对于java jar:

       java -jar xxx.jar -DdemoVar="test"
      

      您可以使用System.getProperty("demoVar") 从代码中获取它。

      如果您确实需要使用环境变量,请使用操作系统功能。 对于 Linux:

      demoVar="test" mvn clean install
      

      对于 Windows PowerShell:

      $env:demoVar = 'test'; mvn clean install
      

      【讨论】:

      • 谢谢! $env:demoVar = 'test'; mvn clean install - 快速简单且有效
      猜你喜欢
      • 1970-01-01
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 2014-07-02
      • 1970-01-01
      • 2021-08-10
      相关资源
      最近更新 更多