如何在单元测试中设置系统环境变量

有时我们需要通过读取系统环境变量来获取一些有用的信息,比如系统路径、临时目录等。在系统真正运行的时候我们可以通过启动命令行,如:java -Dxxx.xxx=xxxx …,或者使用System.setProperty(“xxx.xxx”, “xxx.xxx”)来设置系统环境变量。但在单元测试时如何设置这些系统环境变量又成了一个让人头疼的问题。有些小伙伴是在setUp方法里设置,比如:

@Beforepublic void setUp() throws LicenseException{ PowerMockito.mockStatic(XXXSystem.class); System.setProperty("xxx.xxx", "xxx.xxx");}

但是我们很快就会发现,这种设置方法在只有一个测试用例的时候是OK的,当你的测试类里有多个@Test标签时,就会发生一些很奇怪的问题。比如某些用例读到了环境变量,有些却没有读取到。主要的原因是System.setProperty(“xxx.xxx”, “xxx.xxx”);方法是会作用在整个JVM上的,而多个测试用例是会在同一个JVM上面运行的,而JUnit的@Before标签标示的方法又会在每个测试用例启动前运行,这样就会导致环境变量相互覆盖。特别是开启并发执行单元测试功能时,这种现象更加严重。那么如何设置环境变量才是安全的呢?首先,我们要抛弃在setUp方法里设置环境变量的做法,然后在POM文件中做如下配置:

<properties> <!-- 单元测试时,系统参数iemp.home的路径--> <test.home>${project.build.directory}/opt/server</test.home></properties> ...<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.18.1</version> <configuration> .... <systemPropertyVariables> <home>${test.home}</home> </systemPropertyVariables> </configuration></plugin>

这样我们就可以很轻松的在单元测试中读取系统环境变量了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JAVA烂猪皮

JAVA多线程与并发学习总结

使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行;当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存...

731
来自专栏最高权限比特流

Servlet详细教程

3054
来自专栏别先生

Hadoop Shell命令(基于linux操作系统上传下载文件到hdfs文件系统基本命令学习)

Apache-->hadoop的官网文档命令学习:http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html...

2537
来自专栏轻量级微服务

微服务下跨语言 RPC 实现

目前主流的 Java 开发框架 Spring Boot,为了更方便集成 gRPC,自己开发了 spring-boot-starter-grpc,仅需简单的几行配...

2303
来自专栏Android-薛之涛

Android-Proguard(混淆)

  混淆这玩意,也是经常用,但也是没总结,趁端午有假有时间,就在这里整理一下,也祝大家端午快乐。

2124
来自专栏技术翻译

JVM体系结构的解释

每个Java开发人员都知道字节码将由JRE(Java运行时环境)执行。但许多人并不知道JRE是Java虚拟机(JVM)的实现,它分析字节码,解释代码并执行它。作...

1062
来自专栏布尔

js也可以有自定义事件 注入就是这么爽

  在c#中有delegate,还有特殊的可以直接应用于事件编程的delegate,那就是event。而在js中没有c#的event,更没有delegate,有...

2157
来自专栏Android 研究

Android Handler机制1之Thread

每一个进程都有自己的独立的一块内存空间、一组资源系统。其内部数据和状态都是完全独立的。进程的优点是提高CPU的运行效率,在同一个时间内执行多个程序,即并发执行。...

1212
来自专栏我爱编程

Day15进程和线程

多进程 multiprocessing multiprocessing模块提供了一个Process类来代表一个进程对象,下面的例子演示了启动一个子进程并等待其结...

2865
来自专栏Java成神之路

Java之 将程序打包成jar包

   2.指定目录:建一个目录,来存放.class文件和.jar文件。 本文指定目录为 E:\myclass 。

2003

扫码关注云+社区

领取腾讯云代金券