【问题标题】:How to set global environment variables when Unit Testing单元测试时如何设置全局环境变量
【发布时间】:2020-04-01 00:07:49
【问题描述】:

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

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

但是,这似乎并没有用于整个项目。因此,调用此环境变量的类返回 null。如何使我的单元测试及其调用的类使用全局声明的环境变量? TIA。下面是我的环境变量如何在类中使用的代码的 sn-p

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

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

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

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

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

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


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");            
...
}

【问题讨论】:

  • 我评论了你的答案,而不是之前的问题,对不起。您能否向我们展示您的带有 env var 映射的属性文件?另外,您的 LoginClient 上的注释?谢谢。
  • 嗨@SoftwareEngineer,感谢您及时回复。我能够找到修复并已将其发布在下面的答案中。 :)

标签: java spring unit-testing junit


【解决方案1】:

更新:

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

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

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

  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;

【讨论】:

  • 你能告诉我们你的spring配置类,它把环境变量映射到你的java代码吗?您在这里的代码根本没有帮助。从这里的情况来看,您正确使用了 intellij,所以问题在于您的代码以及您如何使用这些变量。
  • 嗨,我更新了问题。请检查现在是否可以。
猜你喜欢
  • 2011-12-12
  • 1970-01-01
  • 2017-12-31
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 2018-06-29
  • 2015-12-07
  • 2011-07-29
相关资源
最近更新 更多