●请申请链接的朋友帮我也做好链接!本站转载他站文章将会注明来源,如果发现未注明或者出处有误,请联系我修改。
●需要gmail的朋友请在留言本留言。
●gold will shining at last, and I will fly, Gook luck for myself.
●小日本看清楚:钓鱼岛从来就是中国的领土!
●需要gmail的朋友请在留言本留言。
●gold will shining at last, and I will fly, Gook luck for myself.
●小日本看清楚:钓鱼岛从来就是中国的领土!
谈Groovy为Java做单元测试
[
2008/09/08 15:57 | by xeric ]
2008/09/08 15:57 | by xeric ]
最近看到有人在Infoq写了用Jruby为Java写测试用例,
感觉不错,脚本语言的简便性得以充分发挥,于是不免手痒,尝试了一下,
Jruby虽好,却发现需要进行编译时出来诸多问题,比如java代码必须放入jruby的libpath下,
虽然不是什么大事,却无形中增加了推广难度,大家肯定会排斥做测试还需要这么麻烦的操作。
当然不是没有办法,不过似乎看上去很美的东西总是存在缺憾。
这个和Jruby不是Java原生支持的脚本有一定关系,于是想到了Groovy。
果然,尝试了一下Groovy后,发现其集成度远优于Jruby,
很简单的调用IDE中部署好的java类,无需任额外配置就可以run起来。
于是感觉找到了新路可走,深入挖掘,
单元测试最繁琐的事情当然属mock对象,一个代码中充斥了各种依赖的类,
这些类在正常的运行中又依赖于其他类和诸多环境变量和配置。
当然Groovy是个不错的语言,对于Junit的支持非常优秀,提供了MockFor和StubFor的方法来处理mock。
简单易懂,不过随着测试代码烦琐的深入,问题逐渐出现了。
我需要测试的一个业务类中,调用了一个读取配置的Util,
当然,除非我的运行环境全部run起来才有可能读取到这个配置,否则是读取不了的。
就是以为着我要mock这个读取配置的Util。
这个是个很典型的Groovy范例,我当时看了doc后是这样想的。
然而事实却远比我想象残酷,在我找遍了所有资料,尝试了n种做法后,
突然发现一个严重的问题,所有的例子里,你要mock的对象需要生效,比如是在groovy的脚本中才可以,
换句话说,我mock了一个util类,是的,我确实成功了,我在下面代码总这样使用
import groovy.mock.interceptor.MockFor
class JavaGroovyTest extends GroovyTestCase{
void firstTest(){
def mock = new MockFor(JavaUtil)
mock.demand.returnValue(1..2){false}//before mock, this return true
mock.use{
println(JavaUtil.retrunValue())
}
}
}
如我所料的返回了false,然而当这个util被包含在一个java类写的业务逻辑总,严重问题出现了,
groovy的mock无法使作用域进入class。
//java class, this is java code!
public class JavaClass
{
public boolean doReturnValue(){
return JavaUtil.returnValue();
}
}
import groovy.mock.interceptor.MockFor
class JavaGroovyTest extends GroovyTestCase{
void firstTest(){
def mock = new MockFor(JavaUtil)
mock.demand.returnValue(1..2){false}//before mock, this return true
mock.use{
def jc = new JavaClass()
println(jc.doReturnValue())
}
}
}
返回的值依旧是true,而且抛出一个异常:
junit.framework.AssertionFailedError: verify[0]: expected 1..2 call(s) to 'returnValue' but was called 0 time(s).
开始还没理解这个错误究竟怎么回事,后来发现,由于所调用的returnValue是在java的class中,
对于这个测试用例来说,根本就没有调到mock出来的returnValue方法,而这个方法要求至少被执行1-2次,
这个执行操作没有发生,因此就抛出了这个错。
如果mock根本就无法介入java的class,那么意味着使用Groovy的纯粹性大大下降,
我们写测试的话,必须把java和groovy混着写才行,我想没有一个公司的代码管理者希望看到这样的情况。
不知道有没有其他办法来解决这个问题,我暂时是没辙了,
感觉上想让脚本进入项目还有点时间。
感觉不错,脚本语言的简便性得以充分发挥,于是不免手痒,尝试了一下,
Jruby虽好,却发现需要进行编译时出来诸多问题,比如java代码必须放入jruby的libpath下,
虽然不是什么大事,却无形中增加了推广难度,大家肯定会排斥做测试还需要这么麻烦的操作。
当然不是没有办法,不过似乎看上去很美的东西总是存在缺憾。
这个和Jruby不是Java原生支持的脚本有一定关系,于是想到了Groovy。
果然,尝试了一下Groovy后,发现其集成度远优于Jruby,
很简单的调用IDE中部署好的java类,无需任额外配置就可以run起来。
于是感觉找到了新路可走,深入挖掘,
单元测试最繁琐的事情当然属mock对象,一个代码中充斥了各种依赖的类,
这些类在正常的运行中又依赖于其他类和诸多环境变量和配置。
当然Groovy是个不错的语言,对于Junit的支持非常优秀,提供了MockFor和StubFor的方法来处理mock。
简单易懂,不过随着测试代码烦琐的深入,问题逐渐出现了。
我需要测试的一个业务类中,调用了一个读取配置的Util,
当然,除非我的运行环境全部run起来才有可能读取到这个配置,否则是读取不了的。
就是以为着我要mock这个读取配置的Util。
这个是个很典型的Groovy范例,我当时看了doc后是这样想的。
然而事实却远比我想象残酷,在我找遍了所有资料,尝试了n种做法后,
突然发现一个严重的问题,所有的例子里,你要mock的对象需要生效,比如是在groovy的脚本中才可以,
换句话说,我mock了一个util类,是的,我确实成功了,我在下面代码总这样使用
import groovy.mock.interceptor.MockFor
class JavaGroovyTest extends GroovyTestCase{
void firstTest(){
def mock = new MockFor(JavaUtil)
mock.demand.returnValue(1..2){false}//before mock, this return true
mock.use{
println(JavaUtil.retrunValue())
}
}
}
如我所料的返回了false,然而当这个util被包含在一个java类写的业务逻辑总,严重问题出现了,
groovy的mock无法使作用域进入class。
//java class, this is java code!
public class JavaClass
{
public boolean doReturnValue(){
return JavaUtil.returnValue();
}
}
import groovy.mock.interceptor.MockFor
class JavaGroovyTest extends GroovyTestCase{
void firstTest(){
def mock = new MockFor(JavaUtil)
mock.demand.returnValue(1..2){false}//before mock, this return true
mock.use{
def jc = new JavaClass()
println(jc.doReturnValue())
}
}
}
返回的值依旧是true,而且抛出一个异常:
junit.framework.AssertionFailedError: verify[0]: expected 1..2 call(s) to 'returnValue' but was called 0 time(s).
开始还没理解这个错误究竟怎么回事,后来发现,由于所调用的returnValue是在java的class中,
对于这个测试用例来说,根本就没有调到mock出来的returnValue方法,而这个方法要求至少被执行1-2次,
这个执行操作没有发生,因此就抛出了这个错。
如果mock根本就无法介入java的class,那么意味着使用Groovy的纯粹性大大下降,
我们写测试的话,必须把java和groovy混着写才行,我想没有一个公司的代码管理者希望看到这样的情况。
不知道有没有其他办法来解决这个问题,我暂时是没辙了,
感觉上想让脚本进入项目还有点时间。
最近又迷上seam了
[
2008/08/07 11:26 | by xeric ]
2008/08/07 11:26 | by xeric ]
真是佩服自己的杂食能力,
又要新开辟一块战场了,不过整体来说还是对于快速开发和敏捷编程的喜爱。
不过seam有一点让我不是很喜欢,前端用的是JSF。
不知道是不是web bean在jsf里面运作的更好才这样选择的。
我是不太喜欢看着页面里面一堆tag的,对于维护来说,无疑是噩梦。
尽管ror里面也有很多tag,但是脚本语言的清晰度却要远远强于JSF这种复杂的东西。
而且是事件驱动的,暂时还没看到这块的优势在什么地方,
似乎更喜欢ror那种简单清晰的事件驱动模型。
REST也没有摸到,还在找。
不过后端的思想很不错,避免了诸多对象的转来转去。
现在还有一个比较迷惑的地方,看起来entity bean能够直接进入web层是个很不错的选择,
但java ee毕竟是java ee,不是ror,
当我希望把web层剥离出来单独部署的时候,怎么减少entity bean的串行化传输量和解决lazy load的问题,
好像还没有想明白。
难道在seam bean中的注入时定义一个体积较小的vo对象在处理,似乎回到了po转vo的模式。
再找找答案吧,
整体来说seam值得一看,gavin king确实是个天才。
又要新开辟一块战场了,不过整体来说还是对于快速开发和敏捷编程的喜爱。
不过seam有一点让我不是很喜欢,前端用的是JSF。
不知道是不是web bean在jsf里面运作的更好才这样选择的。
我是不太喜欢看着页面里面一堆tag的,对于维护来说,无疑是噩梦。
尽管ror里面也有很多tag,但是脚本语言的清晰度却要远远强于JSF这种复杂的东西。
而且是事件驱动的,暂时还没看到这块的优势在什么地方,
似乎更喜欢ror那种简单清晰的事件驱动模型。
REST也没有摸到,还在找。
不过后端的思想很不错,避免了诸多对象的转来转去。
现在还有一个比较迷惑的地方,看起来entity bean能够直接进入web层是个很不错的选择,
但java ee毕竟是java ee,不是ror,
当我希望把web层剥离出来单独部署的时候,怎么减少entity bean的串行化传输量和解决lazy load的问题,
好像还没有想明白。
难道在seam bean中的注入时定义一个体积较小的vo对象在处理,似乎回到了po转vo的模式。
再找找答案吧,
整体来说seam值得一看,gavin king确实是个天才。
既然你支持ZD和抵制奥运,我只好和你说再见notepad++
[
2008/05/20 10:30 | by xeric ]
2008/05/20 10:30 | by xeric ]
昨天本打算把notepad++推荐给别人,
结果上官网首页一看,差点没吐血,居然抵制奥运,
当然就是拿些什么西藏人权问题来说话了,
既然如此,你喜欢地址奥运是你的爱好,我喜欢抵制你也是我的爱好,
顺带让身边在用的朋友也一起和我爱好一下了。
换SciTE、notepad2,也不用你了。
结果上官网首页一看,差点没吐血,居然抵制奥运,
当然就是拿些什么西藏人权问题来说话了,
既然如此,你喜欢地址奥运是你的爱好,我喜欢抵制你也是我的爱好,
顺带让身边在用的朋友也一起和我爱好一下了。
换SciTE、notepad2,也不用你了。
打算重新启动boblog的flash相册开发
[
2008/04/22 15:31 | by xeric ]
2008/04/22 15:31 | by xeric ]
一直没时间管,
不知道1个月后能不能稍微那么一点点的闲下来,
如果有时间,就准备重新启动boblog的flash相册插件,
感觉imagebox老了点,而且没法配所有的皮肤,
想寻觅一下更好的flash程序进行改造,
自己从头写的话估计周期会很长,而且没很好的美工支持。。。
我现在拖欠的任务估计已经“罄竹难书”了,感叹一下自己的拖劲,
一个月后应该会公布一个新的web应用,呵呵,这边留点胃口呗。
和我这个年龄段的人很有关系哦:)
不知道1个月后能不能稍微那么一点点的闲下来,
如果有时间,就准备重新启动boblog的flash相册插件,
感觉imagebox老了点,而且没法配所有的皮肤,
想寻觅一下更好的flash程序进行改造,
自己从头写的话估计周期会很长,而且没很好的美工支持。。。
我现在拖欠的任务估计已经“罄竹难书”了,感叹一下自己的拖劲,
一个月后应该会公布一个新的web应用,呵呵,这边留点胃口呗。
和我这个年龄段的人很有关系哦:)
最近网上抵制消息一浪高过一浪,
大家的msn也是一个个红彤彤的,包括我的,
不过这次抵制真的不怎么样,个人感觉。
抵制JLF的人,我不知道有多少,
但是我就问一句:你们宣布自己开始抵制前,用你们的大脑好好思考了没?
如果没有,恭喜你,你和被DL利用的那些ZD分子没什么区别,
我不知道JLF支持DL的消息从何而来,至少,我没听到官方消息,
很多人觉得官方消息保守,那请问这种空穴来风的消息就不过激了?
抵制抵制,口号喊的响,不去买JLF的东西就以为自己团结了?
中国的国际地位就提高了?世界就和平了?如果真有其事,法国佬就因为这种抵制行为不支持DL了?
国家就富强了?人民就幸福了安康了?别的国家就看得起中国了?
这个就是不用大脑思考最后导致的幼稚!
这几天天天喊着口号要抵制的人,请问一下,你们中有几个能抵制一辈子的?做不到就别把自己装的很nb的爱国!
法国只是一个,还有德国呢,美国呢,日本呢,你们倒是都抵制啊,干脆自闭国门吧?
不夸张的讲,国际上很多有奶就是娘的国家都在和中国对着干呢,
中国现在遇到的问题说明中国在国际上的低位还有待提高,
但是提高不是靠抵制来做到的,“给点法国佬颜色看看,让他们见识一下中国人的力量”是这样来实现的?
别让别人笑话了,中国缺乏的是自身的实力,中国经历满清到一仗后退几十年的情况,
想要提高自身实力就应该静下心来搞发展,把综合国力搞上去,
中国的国际地位要有足够后备支持,什么是后备支持?经济,军事,生产力这些硬实力,
靠几个天天喊抵制的愤愤之辈,中国怎么提高?
我不想去讨论老外是不是能在JLF的销售中攫取中国人的利润问题,
只要没有违反商业法则,竞争就是必要的,
把国外的企业抵制的干干净净你们就以为为中国的企业扫清障碍了?扯蛋!
国内那么多企业被保护的那么好,结果不是提高到国际水平,而是拿自己人开玩笑,造点不负责任的产品。
在恶劣的环境下生存,发展,超越,反击,这是每个中国人心里应该拥有的东西,卧薪尝胆,奋发图强,
而不是天天叫叫抵制!
任何东西需要更加包容和吸收,师夷长技以制夷,学习甚至是抄袭。
很久前看到国内的Meizu搞自己的手机在德国被查了,骂声一片,说中国人只会抄,没自己的创造,
你们骂的人里面有没有现在在喊抵制的?
实在是搞笑,自己的技术落后人家这么多,不要寄希望于一夜超越,你们当中国是superman啊?
模仿甚至是抄袭很多时候都是必经之路,问题是,我们在不在提高?国人有没有看到进步?
好了,我会该申明一下我爱自己的国家了,否则又有愤青看到这个要骂我卖国贼了,虽然我不会生气而会觉得可悲。我的每一份心都在向着自己的国家,不过不是盲目的保护,而是理性的看待。
理性的为国家出力,看待国家的发展,不要国家一有贪污就说国家完蛋了,国外一施压就觉得我要抵抗了。
中国总是有这么一帮人唯恐天下不乱,何必呢?
大家的msn也是一个个红彤彤的,包括我的,
不过这次抵制真的不怎么样,个人感觉。
抵制JLF的人,我不知道有多少,
但是我就问一句:你们宣布自己开始抵制前,用你们的大脑好好思考了没?
如果没有,恭喜你,你和被DL利用的那些ZD分子没什么区别,
我不知道JLF支持DL的消息从何而来,至少,我没听到官方消息,
很多人觉得官方消息保守,那请问这种空穴来风的消息就不过激了?
抵制抵制,口号喊的响,不去买JLF的东西就以为自己团结了?
中国的国际地位就提高了?世界就和平了?如果真有其事,法国佬就因为这种抵制行为不支持DL了?
国家就富强了?人民就幸福了安康了?别的国家就看得起中国了?
这个就是不用大脑思考最后导致的幼稚!
这几天天天喊着口号要抵制的人,请问一下,你们中有几个能抵制一辈子的?做不到就别把自己装的很nb的爱国!
法国只是一个,还有德国呢,美国呢,日本呢,你们倒是都抵制啊,干脆自闭国门吧?
不夸张的讲,国际上很多有奶就是娘的国家都在和中国对着干呢,
中国现在遇到的问题说明中国在国际上的低位还有待提高,
但是提高不是靠抵制来做到的,“给点法国佬颜色看看,让他们见识一下中国人的力量”是这样来实现的?
别让别人笑话了,中国缺乏的是自身的实力,中国经历满清到一仗后退几十年的情况,
想要提高自身实力就应该静下心来搞发展,把综合国力搞上去,
中国的国际地位要有足够后备支持,什么是后备支持?经济,军事,生产力这些硬实力,
靠几个天天喊抵制的愤愤之辈,中国怎么提高?
我不想去讨论老外是不是能在JLF的销售中攫取中国人的利润问题,
只要没有违反商业法则,竞争就是必要的,
把国外的企业抵制的干干净净你们就以为为中国的企业扫清障碍了?扯蛋!
国内那么多企业被保护的那么好,结果不是提高到国际水平,而是拿自己人开玩笑,造点不负责任的产品。
在恶劣的环境下生存,发展,超越,反击,这是每个中国人心里应该拥有的东西,卧薪尝胆,奋发图强,
而不是天天叫叫抵制!
任何东西需要更加包容和吸收,师夷长技以制夷,学习甚至是抄袭。
很久前看到国内的Meizu搞自己的手机在德国被查了,骂声一片,说中国人只会抄,没自己的创造,
你们骂的人里面有没有现在在喊抵制的?
实在是搞笑,自己的技术落后人家这么多,不要寄希望于一夜超越,你们当中国是superman啊?
模仿甚至是抄袭很多时候都是必经之路,问题是,我们在不在提高?国人有没有看到进步?
好了,我会该申明一下我爱自己的国家了,否则又有愤青看到这个要骂我卖国贼了,虽然我不会生气而会觉得可悲。我的每一份心都在向着自己的国家,不过不是盲目的保护,而是理性的看待。
理性的为国家出力,看待国家的发展,不要国家一有贪污就说国家完蛋了,国外一施压就觉得我要抵抗了。
中国总是有这么一帮人唯恐天下不乱,何必呢?
听话的狗就能拿到吃的,安逸的活着,拿到所有的荣誉和赞赏。
狼无论如何都只能靠自己的努力,在恶劣的环境下,试图生存。
要有尊严的活着。
写在工作三年的纪念日。
狼无论如何都只能靠自己的努力,在恶劣的环境下,试图生存。
要有尊严的活着。
写在工作三年的纪念日。



2008/01/19 12:30 | by 