Java 单元测试时如何设置全局环境变量

Java 单元测试时如何设置全局环境变量,java,spring,unit-testing,junit,Java,Spring,Unit Testing,Junit,我试图创建一个单元测试,但是,每当我运行它时,我都会在变量上遇到null值。调试此问题指向我的环境变量未在我的单元测试中全局使用。作为一个类我正在测试调用另一个类,然后从环境变量引用它的值。如何在IntelliJ中使用全局环境变量 我已经在测试配置中添加了这样的环境变量, 然而,这似乎并没有在整个项目中使用。因此,调用此环境变量的类将返回null。如何使单元测试及其调用的类使用全局声明的环境变量?。蒂亚。下面是我的代码片段,介绍了如何在类中使用环境变量 @Value("${fintech.cl

我试图创建一个单元测试,但是,每当我运行它时,我都会在变量上遇到
null
值。调试此问题指向我的环境变量未在我的单元测试中全局使用。作为一个
我正在测试调用另一个类,然后从环境变量引用它的值。如何在IntelliJ中使用全局环境变量

我已经在测试配置中添加了这样的环境变量,

然而,这似乎并没有在整个项目中使用。因此,调用此环境变量的类将返回null。如何使单元测试及其调用的类使用全局声明的环境变量?。蒂亚。下面是我的代码片段,介绍了如何在类中使用环境变量

@Value("${fintech.clientid}")
private String clientId;
@Value("${fintech.secret}")
private String clientSecret;
@Value("${digifi-host}")
private String fintechHost;
@Value("${fintech-digifi-login-endpoint}")
private String loginUrl;
@Value("${fintech-single-session-endpoint}")
private String singleSessionUrl;
它从类中调用存储在my application.properties文件中的值。从application.properties文件中,它尝试在运行时声明的环境变量中查找正确的值

So from Java Class > application.properties file/config > Runtime Environment Variables 
下面是调试测试时带有空值的变量的屏幕截图。如您所见,所有的值都是null,这意味着它没有加载我在单元测试中输入的环境变量。在另一个测试用例中,我有一个临时修复(正如我在这里的答案中所说的),它们被填充,因此正确地加载了环境变量,但是在我的许多其他测试用例中,像这样的一个,它没有

附言: 我已经在stackoverflow中找到了相关文章,但它们都是特定于测试类的,并且使用surefire插件或设置环境变量,或者通过pom,但是我不需要它,因为我们需要在运行时使用环境变量,因为变量的值应该是隐藏的,并且在代码上不可见。我只需要整个项目在进行单元测试时使用一个全局环境变量。很像我的项目在正常运行时如何使用我在IDE中设置的环境变量

仅供参考。我已经做过了


A

@ClassRule
public final static EnvironmentVariables EnvironmentVariables=new EnvironmentVariables().set(“property1”、“value1”);
B

@ContextConfiguration(locations=“classpath:application.properties”)
公共类登录服务测试{
...
}
C


org.apache.maven.plugins
maven surefire插件
8082
D

@TestPropertySource(属性={“property1=value1”、“property2=value2”,})
公共类登录服务测试{
...
}
E

公共类登录服务测试{
静止的{
System.setProperty(“property1”、“value1”);
System.setProperty(“property2”、“value2”);
...
}
更新:

这个解决方案对我所有的测试都有效

然后 运行>编辑配置>模板(在侧菜单中)>JUnit

  • 然后把所有的环境变量放在这里
  • 单击左上角窗口上的+并应用
  • 然后删除配置中所有现有的单元测试命令,并继续重新运行所有测试
  • 然后,您将看到在所有新的和即将进行的单元测试中自动添加环境变量

    您不必像我之前所做的那样,手动将环境变量添加到每个单元测试命令中。您是否应该更新环境变量。删除需要更新的主单元测试配置,并更新JUnit模板,以便更改将反映到新的单元测试你可能有一顶帽子

  • 附言:

    问题是,我在我的一些单位仍然遇到同样的问题 测试,即使正在读取环境变量 在运行时和某些单元测试中正确地使用上述配置是正确的。它仅在 其他许多单元测试的环境变量都不相同 被类正确地检索或接收 我认为我的班级并没有得到合适的环境 变量,我存储数据的方式肯定有问题 IntelliJ中的环境变量,它实际上没有,但是 事实证明,我的代码格式就是问题所在

    事实证明,即使这段特定的代码在运行时工作,它也不会像以前一样在单元测试时工作

    因此,我修改了这些特定的代码,直到我已经能够在单元测试中获得适当的环境变量

    @Value("${fintech.clientid}")
    public void getClientId(String tempClientId) {
        clientId = tempClientId;
    }
    private  String clientId;
    
    @Value("${fintech.secret}")
    public void getClientSecret(String tempClientSecret) {
        clientSecret=tempClientSecret;
    }
    private  String clientSecret;
    
    @Value("${digifi-host}")
    public void getDigifiHost(String tempDigifiHost) {
        digifiHost=tempDigifiHost;
    }
    private  String digifiHost;
    

    你能给我们展示一下你的spring配置类,它将环境变量映射到你的java代码吗?你这里的代码一点帮助都没有。从你这里的代码来看,你正确地使用了intellij,所以问题在于你的代码和你如何使用这些变量。嗨,我更新了这个问题。请检查它是否正确。我对你的answ发表了评论呃,而不是前面的问题,对不起。您能给我们看一下您的带有环境变量映射的属性文件吗?还有,您的LoginClient上的注释?Thx。您好@SoftwareEngineer,谢谢您的回复。我找到了一个修复方案,并已将其发布在下面的答案上。:)
    @Value("${fintech.clientid}")
    private String clientId;
    @Value("${fintech.secret}")
    private String clientSecret;
    @Value("${digifi-host}")
    private String digifiHost;
    
    @Value("${fintech.clientid}")
    public void getClientId(String tempClientId) {
        clientId = tempClientId;
    }
    private  String clientId;
    
    @Value("${fintech.secret}")
    public void getClientSecret(String tempClientSecret) {
        clientSecret=tempClientSecret;
    }
    private  String clientSecret;
    
    @Value("${digifi-host}")
    public void getDigifiHost(String tempDigifiHost) {
        digifiHost=tempDigifiHost;
    }
    private  String digifiHost;