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

iam*_*hua 5 java junit spring unit-testing

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

我已经在测试配置中添加了环境变量,如下所示,

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

@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;
Run Code Online (Sandbox Code Playgroud)

它的作用是从类中调用存储在我的 application.properties 文件中的值。从 application.properties 文件中,它尝试在运行时声明的环境变量中查找正确的值。

So from Java Class > application.properties file/config > Runtime Environment Variables 
Run Code Online (Sandbox Code Playgroud)

下面是调试测试时带有空值的变量的屏幕截图。正如您所看到的,所有值都是空,这意味着它没有加载我在单元测试中放入的环境变量。在我进行了临时修复的另一个测试用例中(正如我在此处输入的答案),它们被填充,因此正确加载了环境变量,但在我的许多其他测试用例中,例如这个,它没有。

在此输入图像描述

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

仅供参考。我已经做了 ff.:


A。

@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;
Run Code Online (Sandbox Code Playgroud)

B.

So from Java Class > application.properties file/config > Runtime Environment Variables 
Run Code Online (Sandbox Code Playgroud)

C。

@ClassRule
public final static EnvironmentVariables environmentVariables = new EnvironmentVariables().set("property1", "value1");
Run Code Online (Sandbox Code Playgroud)

D .

@ContextConfiguration(locations = "classpath:application.properties")
public class LoginServiceTest {
...
}
Run Code Online (Sandbox Code Playgroud)

E.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>  
      <environmentVariables>
        <SERVER_PORT>8082</SERVER_PORT>
      </environmentVariables>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

iam*_*hua 0

更新:

这个解决方案适用于我的所有测试。您可以参考这里了解更多详情。

@RunWith(SpringRunner.class)  //Add this
@SpringBootTest(classes = Application.class)   //Add this
public class LoginServiceTest {
...
}
Run Code Online (Sandbox Code Playgroud)

然后运行 ​​> 编辑配置 > 模板(在侧面菜单中) > JUnit 在此输入图像描述

在此输入图像描述

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

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

附:

事实是,我在一些单元测试中仍然遇到了同样的问题,即使环境变量在运行时被正确读取,并且在某些单元测试中使用上述配置也正常。仅在其他许多单元测试期间,类未正确检索或接收完全相同的环境变量。起初我以为我的类并没有真正获得正确的环境变量,并且我在 IntelliJ 中存储环境变量的方式一定有问题,但事实并非如此,但事实证明我的代码格式就是问题所在。

@Value("${fintech.clientid}")
private String clientId;
@Value("${fintech.secret}")
private String clientSecret;
@Value("${digifi-host}")
private String digifiHost;
Run Code Online (Sandbox Code Playgroud)

事实证明,尽管这个特定的代码在运行时可以工作,但它在单元测试时却不会像以前一样工作。

因此,我修改了这个特定的代码,直到我已经能够在单元测试中获得正确的环境变量。请参阅从上面的代码到下面为我解决问题的代码的更改。

@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;
Run Code Online (Sandbox Code Playgroud)