首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单元测试时如何设置全局环境变量

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

Stack Overflow用户
提问于 2020-04-01 00:07:49
回答 1查看 1.7K关注 0票数 4

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

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

然而,这似乎不适用于整个项目。因此,调用此环境变量的类将返回null。如何使我的单元测试和它调用的类使用全局声明的环境变量?蒂娅。下面是我在类中如何使用环境变量的代码片段

代码语言:javascript
复制
@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文件中,它试图在运行时声明的环境变量中寻找适当的值。

代码语言:javascript
复制
So from Java Class > application.properties file/config > Runtime Environment Variables 

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

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

仅供参考。我已经做过了。

一个。

代码语言:javascript
复制
@ClassRule
public final static EnvironmentVariables environmentVariables = new EnvironmentVariables().set("property1", "value1");

B.

代码语言:javascript
复制
@ContextConfiguration(locations = "classpath:application.properties")
public class LoginServiceTest {
...
}

结果表明,C.

代码语言:javascript
复制
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>  
      <environmentVariables>
        <SERVER_PORT>8082</SERVER_PORT>
      </environmentVariables>
    </configuration>
</plugin>

D。

代码语言:javascript
复制
@TestPropertySource(properties = {"property1=value1","property2=value2",})
public class LoginServiceTest {
...
}

E.

代码语言:javascript
复制
public class LoginServiceTest {    
static{
      System.setProperty("property1", "value1");
      System.setProperty("property2", "value2");            
...
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-01 02:32:56

更新:

这个解决方案适用于我所有的测试。你可以参考这里的更多细节。

代码语言:javascript
复制
@RunWith(SpringRunner.class)  //Add this
@SpringBootTest(classes = Application.class)   //Add this
public class LoginServiceTest {
...
}

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

  1. 然后将所有环境变量放在这里。
  2. 单击左上角窗口的+并应用。
  3. 然后删除配置中的所有现有单元测试命令,然后继续再次明显地重新运行所有测试。
  4. 然后,您将看到所有新的和即将到来的单元测试都会自动添加环境变量。 您不必手动将环境变量添加到每个单元测试命令中,就像我以前做过的烦人的事情一样。您是否需要更新环境变量。删除需要更新的主单元测试配置,然后更新JUnit模板,这样更改将反映到您可能拥有的新单元测试。

PS:

问题是,在一些单元测试中,我仍然遇到了同样的问题,即使环境变量在运行时和某些单元测试中被正确读取,上面的配置也没有问题。只是在其他许多单元测试中,类没有正确地检索或接收相同的环境变量。一开始,我认为我的类并没有真正获得适当的环境变量,而且我在IntelliJ中存储环境变量的方式肯定有问题,这并不是真的,但事实证明,我的代码格式才是问题所在。

代码语言:javascript
复制
@Value("${fintech.clientid}")
private String clientId;
@Value("${fintech.secret}")
private String clientSecret;
@Value("${digifi-host}")
private String digifiHost;

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

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

代码语言:javascript
复制
@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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60961768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档