我正在研究Junit5。我的Java代码使用System.getenv(“ demoVar”)访问环境变量。因此,如何在jUnit5测试类中设置此环境变量,以便我的代码可以在测试期间访问此环境变量的值。
答案 0 :(得分:2)
来自另一个 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();
}
答案 1 :(得分:1)
通常的做法是使用系统属性而不是环境变量。 在这种情况下,您将运行Java / maven / gradle命令或使用-D demoVar =“ {your_value}”选项运行测试所用的任何命令。 对于Maven目标:
maven clean install -DdemoVar="test"
对于Java jar:
java -jar xxx.jar -DdemoVar="test"
您将可以使用System.getProperty("demoVar")
从代码中获取它。
如果您确实需要使用环境变量,请使用OS功能。 对于Linux:
demoVar="test" mvn clean install
对于Windows PowerShell:
$env:demoVar = 'test'; mvn clean install
答案 2 :(得分:0)
您无法进入实际的Java进程,因为使用getenv的这些环境值是不可变的。
一种方法是启动另一个vm或另一个可以引入新环境值的进程。
另一种方法是切换到 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"));
}
}
答案 3 :(得分:0)
这可以通过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
}
}