如何从Java设置环境变量?我看到我可以使用子进程执行此操作ProcessBuilder.我有几个子进程要启动,所以我宁愿修改当前进程的环境,让子进程继承它.
有一个System.getenv(String)获取单个环境变量.我也可以获得一套Map完整的环境变量System.getenv().但是,要求put()对Map引发UnsupportedOperationException-显然,他们的意思是对环境只能被读取.并且,没有System.setenv().
那么,有没有办法在当前运行的进程中设置环境变量?如果是这样,怎么样?如果没有,理由是什么?(这是因为这是Java,因此我不应该做一些邪恶的非便携式过时的事情,比如触摸我的环境吗?)如果没有,那么管理环境变量的任何好建议都会改变我需要提供给几个子进程?
我想编写一些检查已部署WAR的XML Spring配置的测试.不幸的是,某些bean需要设置一些环境变量或系统属性.在使用带有@ContextConfiguration的方便测试样式时,如何在初始化spring bean之前设置环境变量?
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
public class TestWarSpringContext { ... }
Run Code Online (Sandbox Code Playgroud)
如果我使用注释配置应用程序上下文,我没有看到一个钩子,我可以在初始化spring上下文之前执行某些操作.
我正在尝试为Spring Boot应用程序使用junit和mockito(对此非常新)编写单元测试。基本上,在我的代码中,我为manifest.yml文件(用于部署)中的特定URL指定了一个环境变量,可以String URL = System.getenv("VARIABLE")在我的代码中访问该变量。但是,由于URL变量显然未定义,因此我在单元测试中遇到了很多麻烦。我在这里尝试了该解决方案,但是意识到这仅用于模拟环境变量(如果您从实际测试本身调用它),而不是如果您依赖于可从代码访问的环境变量。
有什么方法可以设置它,以便在运行测试时可以设置可以在代码中访问的环境变量?
长话短说,我必须在运行时为特定测试设置一个环境。
这里的答案很好用,我正在使用这个。问题是我收到此警告:
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by **YOUR PACKAGE** (file: **YOUR FILE** ) to field java.util.Collections$UnmodifiableMap.m
WARNING: Please consider reporting this to the maintainers of **YOUR PACKAGE**
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Run Code Online (Sandbox Code Playgroud)
我已经开始寻找解决方案,这里的另一个 SO 答案“解决”了单元测试的问题,使用相同的方法设置环境变量。
我正在谈论来自他们的 Github 源代码的这行代码,它触发了这个错误。( field.setAccessible(true);)
所以看起来除了设置给定的标志之外没有其他方法可以解决这个问题,就像警告所建议的那样。
然后我想知道这个警告是否严重,以及我的程序是否会在几个月内运行(我使用的是 OpenJDK 11)。事实证明,这个illegal-access …
我们使用类似于系统规则的方法来处理JUnit 4测试中的(系统)属性.这样做的主要原因是在每次测试后清理环境,以便其他测试不会无意中依赖于可能的副作用.
自JUnit 5发布以来,我想知道是否有"JUnit 5方式"这样做?
我有3个测试类如下:
package com.junittest.testcases;
Test3类:
import junit.framework.TestCase;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestRule;
import annotations.DataSetRule;
import annotations.DataSets;
import com.junittest.test.MyClass;
public class Test3 extends TestCase{
MyClass m = new MyClass();
String group = "user";
@Rule
public TestRule dataSetRule = new DataSetRule();
@Test
public void test5() {
System.out.println("In Test 5");
//assertEquals(5, m.add(2,3));
}
@Test
public void test6() throws Exception {
org.junit.Assume.assumeTrue(group.equals("user"));
System.out.println("In Test 6");
//assertEquals(-2, m.sub(2,3));
}
@DataSets({"dataset","dataset1"})
@Test
public void test7() {
System.out.println("In Test 7");
}
@Ignore
@Test
public void …Run Code Online (Sandbox Code Playgroud) 我正在用 Junit 测试一个委托类。当我右键单击“运行配置”并将键值对放在“环境”选项卡中时,它工作正常。
我尝试从静态块以及 @Before 方法设置它失败。你能帮我吗?
public MyClass{
public void myMethod(){
String tmp = configProps.getProperty("auto_commit_location");
String commitScriptLocation = System.getenv(tmp);
System.out.println(commitScriptLocation); --- This returns null
}
}
Junit Test:
public class AutoCommitControlDelegateTest {
static {
System.setProperty("auto_commit_location", "/tmp/");
}
@Autowired
private *******
//calls to my methods
Run Code Online (Sandbox Code Playgroud)