利用h2database和easymock轻松不依赖环境单元测试(rose等spring环境万能)

标签: java easymock h2database | 发表时间:2012-08-01 10:15 | 作者:54chen
分享到:
出处:http://www.54chen.com

以下内容由 [五四陈科学院]提供

h2database,easymock
前言
写java时间久了,慢慢就变得自信了,也可能是变得懒了,或者是项目进度的原因,test case越写越少,越来越不写了。
还有一个很大的原因是,DB环境不好搞,老是有垃圾数据,依赖的东西太多,有memcache、有别人的服务,等等等等,都是没有test case良好的理由。

下面将以rose环境下,使用easy mock搞写第三方依赖和h2database搞写DB环境为例子,简单讲述如何轻松测试。

完整代码可以在 https://github.com/XiaoMi/rose 下载到。

依赖的包介绍
spring-test:提供一些基础的spring环境的支持,如果你不是spring环境,可能不需要。
h2:一个内存数据库,使用它的原因是,我们的业务大多数时候使用的都是mysql,而h2有一个mysql模式,可以支持绝大多数的mysql的SQL语句。
easymock:以前在五四陈科学院提到过的利器,用来模拟各种调用的工具。

pom定义为:

  1.       <dependency>  
  2.     <groupId>org.springframework</groupId>  
  3.     <artifactId>spring-test</artifactId>  
  4.     <version>2.5.6</version>  
  5.     <scope>test</scope>  
  6. </dependency>  
  7. <dependency>  
  8.     <groupId>com.h2database</groupId>  
  9.     <artifactId>h2</artifactId>  
  10.     <version>1.3.163</version>  
  11.     <scope>test</scope>  
  12. </dependency>    
  13. <dependency>  
  14.     <groupId>org.easymock</groupId>  
  15.     <artifactId>easymockclassextension</artifactId>  
  16.     <version>2.4</version>  
  17.     <scope>test</scope>  
  18. </dependency>  

基础配置与schema.sql准备
在test/resources下我们需要两个关键的文件:applicationContext.xml 与 schema.sql

applicationContext.xml定义了test执行时扫描的情况,同正常运行时使用的配置大同小异。不同在于需要替换db定义中的mysql driver为h2的driver,关键部分:

  1. <property name="driverClassName" value="org.h2.Driver"></property>  
  2. <property name="url" value="jdbc:h2:mem:testdb;MODE=MYSQL;DB_CLOSE_DELAY=-1"></property>    

而schema.sql文件定义了初始化的表结构,这个文件的出现是因为h2与mysql还是有一定的语法区别的,不过在我的使用过程中,基本上只有create table的那个引擎声明是不支持的,所以喽,干掉先。

H2下的DAO的Test的代码示例
在test case的初始化状态里需要导入schema.sql,代码如下:

  1. Statement st = conn.createStatement();  
  2.          st.execute("drop all objects;");  
  3.          st.execute("runscript from '" + new DefaultResourceLoader().getResource("schema.sql").getURL().toString() + "'");  
  4.          st.close();  

而如果是spring/rose环境,则可以再加载上context.xml文件,代码如下:

  1. @RunWith(SpringJUnit4ClassRunner.class)  
  2. @ContextConfiguration(locations = "classpath:applicationContext.xml")  
  3. public class TestDAOTest {  

然后就开始写测试代码:

  1. @Test  
  2.     public void getTestTest() {  
  3.         com.chen.model.Test t = testDAO.getTest();  
  4.   
  5.         Assert.assertEquals(111, t.getId());  
  6.     }  


easymock的代码示例

easymock以前也提到过,这里再提一次: http://www.54chen.com/java-ee/spring-easymock-tutorial.html

  1. @Test  
  2.   public void getTestTest() {  
  3.       com.chen.model.Test t = new com.chen.model.Test();  
  4.       t.setId(1111);  
  5.       t.setMsg("adfadf");  
  6.       TestDAO testDAO = EasyMock.createMock("testDAO", TestDAO.class);  
  7.       EasyMock.expect(testDAO.getTest()).andReturn(t);  
  8.       EasyMock.replay(testDAO);  
  9.       ReflectionTestUtils.setField(service, "testDAO", testDAO, TestDAO.class);  
  10.       t = service.getTest();  
  11.       // 确信使用了mock  
  12.       EasyMock.verify(testDAO);  
  13.       Assert.assertEquals(1111, t.getId());  
  14.   }  

mock其他东西以此类推。

后序
至此,已经可以mock一切了,你还有什么理由不写test case呢?
本文完整代码可以在 https://github.com/XiaoMi/rose 下载到。



想快点找到作者也可以到Twitter上留言: @54chen
或者你懒得带梯子上墙,请到新浪微博: @54chen

相关 [利用 h2database easymock] 推荐:

利用h2database和easymock轻松不依赖环境单元测试(rose等spring环境万能)

- - 五四陈科学院-坚信科学,分享技术
以下内容由 [五四陈科学院]提供. 写java时间久了,慢慢就变得自信了,也可能是变得懒了,或者是项目进度的原因,test case越写越少,越来越不写了. 还有一个很大的原因是,DB环境不好搞,老是有垃圾数据,依赖的东西太多,有memcache、有别人的服务,等等等等,都是没有test case良好的理由.

easymock教程-目录

- 赵星云 - BlogJava-首页技术区
easymock是目前java mock 工具中比较流行的工具,这个教程将系统的介绍easymock的使用. 主要内容来自easymock的官网教程,针对日常使用进行了一些筛选和补充,另外增加一些个人的理解和认识. 另外考虑到网络上已有不少分散的教程,我将适当的链接进来. 教程的内容将在随后逐渐添加,目前计划的目录如下,相应内容完成之后我将逐个更新此文的链接.

EasyMock教程-入门指南

- - 博客 - 伯乐在线
在过去,我会经常向你展示 EasyMock 是什么和怎样使用它测试你的Java应用. 基于这个目的,我将创建一个简单的股票程序并使用 JUnit 和 EasyMock 库测试. 在开始之前,让我们先理解一下使用 EasyMock 的需求. 加入,你在创建一个Android 移动应用用来获取用户股票档案.

利用sockstunnel翻越

- - 0.618網絡空間
首先在你的linux vps上搭建python環境(一般來說,linux vps都已搭好了python 環境). 然後運行如下命令(假設你在/root下):. 這樣在/root/下,就生成了privkey.pem和cacert.pem. 修改sslserver.py裏的. keyfile="privkey.pem",為.

转角的空间利用

- Ivy - IDSOO
拐角的空间如果不充分利用似乎有一些浪费. 日本的设计工作室Torafu Architects设计的这个隔板巧妙地利用了拐角,搭建了一个可以放置物品的平台,设计实用、美观、大方.

旧灯泡的再利用

- Jimmy - 微奇生活
生活水平提高了,家家户户也用上了节能灯,那些废旧的白炽灯泡如何利用呢. 看看下面这些妙点子吧,可以种盆栽,做工艺品,还能用来养金鱼~~灯泡还会跳舞呢. 简洁的线圈灯:Coil Lamp. 微博:@新浪 | @腾讯     订阅:Google | 九点 | QQ | 鲜果 | 有道 | 邮箱.

[译]jboss漏洞利用

- - 互联网 - ITeye博客
原文地址:http://resources.infosecinstitute.com/jboss-exploitation/. JBoss Application Server是一个基于Jave EE的web应用服务器. 如果Jboss没有正确配置,它会允许攻击者进行各种恶意攻击. 由于JMX console可以通过端口8080远程访问,攻击者和恶意用户可以通过使用Jboss console中的DeploymentScanner功能部署他们自己的WAR(web archive)文件或shell脚本.

利用HTTP Cache来优化网站

- scourgen - 博客园-首页原创精华区
用户总是讨厌等待,面对加载的Video和页面,是非常糟糕的用户体验. 所以如何利用Cache来优化网站,值得深入研究. 缓存是一个到处都存在的用空间换时间的例子. 通过使用多余的空间,我们能够获取更快的速度. 用户在浏览网站的时候,浏览器能够在本地保存网站中的图片或者其他文件的副本,这样用户再次访问该网站的时候,浏览器就不用再下载全部的文件,减少了下载量意味着提高了页面加载的速度.

利用 nose 测试 web.py 程序

- Ken - python.cn(jobs, news)
#index.py   ----    web.py主文件. #nose_test.py ---- 测试文件脚本. -s:显示脚本print信息,默认是print的信息是不输出的. nose会查找脚本中 test_*命名的函数和Test_*命名的类. 运行测试脚本时,首先会运行脚本func级别的setUp()函数,.

Google专利“用手套看世界”

- Saint Raphael - Solidot
美国专利商标局(USPTO)授予了Google一项专利“Seeing with your hand”,简而言之是利用整合传感器的手套观察周围环境或利用手势控制电脑. 发明人之一是Google联合创始人Sergey Brin. Google在专利中解释了灵感来源:如果有东西掉进到沙发下面,人们会很自然的将手伸进沙发下去摸,通过触摸确定位置.