当前位置: 首页 > news >正文

使用junitamp;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 就可以了,可以在程序里面写死配置文件。
从而不影响代码结构,不影响系统部署。

相关文章:

  • Eclipse下使用Subversion =subclipse
  • 上传附件
  • check_nginx pnp4nagios 模版
  • 统计挖掘那些事那些情(2)-回归分析spss
  • redis应用之主从架构配置
  • android MediaCodec 音频编解码的实现——转码
  • 2014.9.30 Double转字符
  • 【转载】【容斥原理】
  • 持续改进不能止步于回顾
  • bzoj3043IncDec Sequence*
  • JDK + Tomcat的安装
  • 交换机生成树协议配置
  • mysql-5.7.9-winx64在windows上安装遇到的一些问题
  • 极光推送
  • 微积分
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • eclipse(luna)创建web工程
  • fetch 从初识到应用
  • input实现文字超出省略号功能
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • JS+CSS实现数字滚动
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Python连接Oracle
  • Rancher如何对接Ceph-RBD块存储
  • SQL 难点解决:记录的引用
  • tab.js分享及浏览器兼容性问题汇总
  • Vue.js-Day01
  • Vue官网教程学习过程中值得记录的一些事情
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 数据科学 第 3 章 11 字符串处理
  • 一道闭包题引发的思考
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​学习一下,什么是预包装食品?​
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)Sql Server 保留几位小数的两种做法
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • *Django中的Ajax 纯js的书写样式1
  • .net Application的目录
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET Standard 的管理策略
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .NetCore实践篇:分布式监控Zipkin持久化之殇