使用junit&spring修改系统的环境变量,解决docker程序测试问题

1,修改系统环境变量



首先环境变量在java运行的时候是修改不了的。
已经设置成只读了虽然方法都能调用。
这个有啥用呢?因为docker开放的应用程序的环境变量都是这样设置的。
docker在启动的时候设置了环境变量,然后应用程序就可以直接调用了。
调用的方法java就是通过 System.getenv()获得的。
有spring的程序,直接使用${jdbc.url}写在xml的配置文件就好。
spring已经支出从系统环境变量里面获得参数了。

System.out.println(System.getenv("test.env"));
//如果使用:会报错异常。
System.getenv().put("test.env","1234");

2,解决办法



http://stackoverflow.com/questions/8168884/how-to-test-code-dependent-on-environment-variables-using-junit
使用一个开源框架:
https://github.com/stefanbirkner/system-rules
增加maven配置:这两个包必须引用,否则类找不到。

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!-- https://github.com/stefanbirkner/system-rules -->
        <dependency>
            <groupId>com.github.stefanbirkner</groupId>
            <artifactId>system-rules</artifactId>
            <version>1.16.1</version>
            <scope>test</scope>
        </dependency>

3,代码编写



将两个maven配置修改后就可以测试了。

import org.junit.Test;
import org.junit.Rule;
import org.junit.contrib.java.lang.system.EnvironmentVariables;
public void EnvironmentVariablesTest {
  @Rule
  public final EnvironmentVariables environmentVariables
    = new EnvironmentVariables();

  @Test
  public void setEnvironmentVariable() {
    environmentVariables.set("name", "value");
    assertEquals("value", System.getenv("name"));
  }
}

可以直接修改系统的环境变量。

5, 和spring结合



但是,但是,对应普通函数是可以的,但是对于spring的函数是不行的。
因为在这个类里面进行配置之后,spring已经启动完成了。还是没有获得环境变量。
解决办法,创建一个自己的MySpringJUnit4ClassRunner 类:

import org.junit.Rule;
import org.junit.contrib.java.lang.system.EnvironmentVariables;
import org.junit.runners.model.InitializationError;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

public class MySpringJUnit4ClassRunner extends SpringJUnit4ClassRunner {

    @Rule
    public final EnvironmentVariables environmentVariables
            = new EnvironmentVariables();

    public MySpringJUnit4ClassRunner(Class<?> clazz) throws InitializationError {
        super(clazz);
        //http://stefanbirkner.github.io/system-rules/#EnvironmentVariables
        environmentVariables.set("name", "value");
    }
}

替换@RunWith(MySpringJUnit4ClassRunner.class)就可以了。

import org.junit.Test;
import org.junit.Rule;
import org.junit.contrib.java.lang.system.EnvironmentVariables;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(MySpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:META-INF/spring/*.xml"})
public void EnvironmentVariablesTest {

  @Test
  public void setEnvironmentVariable() {
    assertEquals("value", System.getenv("name"));
  }
}

这样在启动的时候就使用了自己的类进行加载了。
在spring配置:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close">
    <property name="driverClass" value="${jdbc.driverClass}"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
    <property name="user" value="${jdbc.user}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>  

在junit里面就可以使用了。

5,总结



本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/52781896 未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys

docker非常火,非常方便了,在写程序的使用需要设置好变量。
但是这个对开发测试弄起来就比较麻烦了。
使用junit & srping 就可以了,可以在程序里面写死配置文件。
从而不影响代码结构,不影响系统部署。

时间: 2024-10-02 04:14:11

使用junit&amp;spring修改系统的环境变量,解决docker程序测试问题的相关文章

换系统后环境变量缺失

问题描述 换系统后环境变量缺失 电脑原装系统中环境变量有很多项,换了系统后少了很多,一般是什么原因呢? 解决方案 这说明一些环境变量是第三方软件或者电脑生产商设置的,而不是操作系统预设的. 解决方案二: 一些软件会修改环境变量,重装之后就还原为系统默认的了

shell-linux中Makefile引用的环境变量跟系统的环境变量不是同一个吗

问题描述 linux中Makefile引用的环境变量跟系统的环境变量不是同一个吗 makefile引用了$(HOME),值是/root,但是在shell中是/home/william,而且export的各种环境变量都不生效,请问是怎么回事 解决方案 如果是全局的,就是一样的. 解决方案二: 你是不是root用户执行的makefile,这样环境变量跟你用户权限时不一样

win10系统java环境变量设置的方法

win10系统java环境变量设置方法介绍: 1.首先,右击"此电脑",选择"属性".如图1所示   图1   2.选择"高级系统设置".如图2所示   图2   3.选择"环境变量".如图3所示   图3   4.选择"新建".如图4所示   图4   5.点击新建后,就会出现这个,变量名为"JAVA_HOME"(复制我引号内的内容就可以了,不含引号,下同),变量值,必须是自己装jdk

修改CentOS的环境变量

一直用fedora系列,但被软件研发告知,fedora13有兼容性问题,建议我用centos,不得已换之. centos是基于redhat服务器版本编译而成,更适合于服务器应用. 试了试一些常用命令都OK,在使用ifconfig, service等命令时报错.. 这些命令都位于/sbin目录下,但CentOS系统环境变量设定中没有/sbin目录,需要手动修改环境变量, 临时用一下也可以使用/sbin/ifconfig这样带上路径执行,或者临时设置环境变量路径. 这是环境变量设置导致,需要使用ex

Linux系统下环境变量添加成功

在Linux系统中设置环境变量 PATH 的方法: 在用户主目录下有一个 .bashrc 文件,可以在此文件中加入 PATH 的设置如下: export PATH="$PATH:/your path1/:/your path2/-.." 注意:每一个 path 之间要用 ":" 分隔. 注销重启 X 就可以了(logout). 这种方法确实是对的,测试过后没有问题,但是要注意刚开始没有认识到的问题,因为profile文件实际上是一段程序,因此在哪里添加的问题着实让我

CentOS7修改JAVA_HOME的环境变量

查看java版本 # echo $JAVA_HOME or java -version 安装java环境 yum install java-1.8.0-openjdk 修改java环境变量 # vim /etc/profile 设置好了JDK,在输入source /etc/profile 就可以生效

Ubuntu中为Android系统实现内置Java应用程序测试Application Frameworks层的硬件服务_Android

我们在Android系统增加硬件服务的目的是为了让应用层的APP能够通过Java接口来访问硬件服务.那么, APP如何通过Java接口来访问Application Frameworks层提供的硬件服务呢?在这一篇文章中,我们将在Android系统的应用层增加一个内置的应用程序,这个内置的应用程序通过ServiceManager接口获取指定的服务,然后通过这个服务来获得硬件服务.        一. 参照在Ubuntu Android实现Application Frameworks层增加硬件访问服

java 环境变量设置-错误: 程序包net.mindview不存在?能否通过设置环境变量来解决?请各位帮忙分析,谢谢

问题描述 错误: 程序包net.mindview不存在?能否通过设置环境变量来解决?请各位帮忙分析,谢谢 //: initialization/Flower.java // Calling constructors with "this" import static net.mindview.util.Print.*; public class Flower { int petalCount = 0; String s = "initial value"; Flow

spring 代码中,解决docker环境变量传递问题

1,docker变量 在docker中定义变量,使用echo $Value 能直接在命令行中显示, 这个使用spring可以直接注入到代码当中. php中有方便的代码直接获得环境变量,但是java用起来就麻烦点. 直接使用spring的value就行了. 2,代码 比如一个spring的用户登录action. 里面用docker配置了一个默认的admin登录名称和密码. 在spring里面可以这样写: import org.springframework.beans.factory.annota