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

时间:2020-04-01 00:07:49

标签: java spring unit-testing junit

我试图创建一个单元测试,但是,每当运行它时,我的变量都会遇到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;

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

So from Java Class > application.properties file/config > Runtime Environment Variables 

下面是调试测试时具有空值的变量的屏幕快照。如您所见,所有值都是null,这意味着它没有加载我在单元测试中输入的环境变量。在我有一个临时修复程序的另一个测试用例中(如我在此处的答案所示),它们被填充,因此可以正确地加载环境变量,但是在我这样的许多其他测试用例中却没有。

enter image description here

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

仅供参考。我已经做了事。:


A。

@ClassRule
public final static EnvironmentVariables environmentVariables = new EnvironmentVariables().set("property1", "value1");

B。

@ContextConfiguration(locations = "classpath:application.properties")
public class LoginServiceTest {
...
}

C。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>  
      <environmentVariables>
        <SERVER_PORT>8082</SERVER_PORT>
      </environmentVariables>
    </configuration>
</plugin>

D。

@TestPropertySource(properties = {"property1=value1","property2=value2",})
public class LoginServiceTest {
...
}

E。

public class LoginServiceTest {    
static{
      System.setProperty("property1", "value1");
      System.setProperty("property2", "value2");            
...
}

1 个答案:

答案 0 :(得分:0)

更新:

此解决方案适用于我的所有测试。 You can refer here for more details.

@RunWith(SpringRunner.class)  //Add this
@SpringBootTest(classes = Application.class)   //Add this
public class LoginServiceTest {
...
}

然后 运行>编辑配置>模板(在侧面菜单中)> JUnit enter image description here

enter image description here

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

    您不必像我之前碰到的那样,将环境变量手动添加到每个单元测试命令中。您是否应该更新环境变量。删除您需要进行更新的主要单元测试配置,然后更新JUnit模板,以使更改反映到您可能具有的新单元测试中。

PS:

问题是,我在某些部门仍然遇到了同样的问题 测试,即使正在读取环境变量 使用上述配置,可以在运行时正确地进行某些单元测试。只有在 其他很多单元测试的环境变量都不太一样 被班级正确检索或接收。起初我 以为我的课没有真正得到适当的环境 变量,关于我如何存储 IntelliJ中的环境变量,实际上不是,但是 原来是我遇到的这种代码格式。

@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;