<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title>xeric flash blog</title> 
<link>http://www.flashot.com/blog/index.php</link> 
<description>在困顿与迷茫中执着地探索</description> 
<language>zh-cn</language> 
<copyright>Powered by Bo-blog 2.0.2 sp2</copyright>
<item>
<link>http://www.flashot.com/blog/read.php?440</link>
<title>谈Groovy为Java做单元测试</title> 
<author>xeric &lt;xeric@flashot.com&gt;</author>
<category>开发[DEV]</category>
<pubDate>Mon, 08 Sep 2008 07:57:23 +0000</pubDate> 
<guid>http://www.flashot.com/blog/read.php?440</guid> 
<description>
<![CDATA[ 
	最近看到有人在Infoq写了用Jruby为Java写测试用例，<br/>感觉不错，脚本语言的简便性得以充分发挥，于是不免手痒，尝试了一下，<br/>Jruby虽好，却发现需要进行编译时出来诸多问题，比如java代码必须放入jruby的libpath下，<br/>虽然不是什么大事，却无形中增加了推广难度，大家肯定会排斥做测试还需要这么麻烦的操作。<br/>当然不是没有办法，不过似乎看上去很美的东西总是存在缺憾。<br/>这个和Jruby不是Java原生支持的脚本有一定关系，于是想到了Groovy。<br/>果然，尝试了一下Groovy后，发现其集成度远优于Jruby，<br/>很简单的调用IDE中部署好的java类，无需任额外配置就可以run起来。<br/>于是感觉找到了新路可走，深入挖掘，<br/>单元测试最繁琐的事情当然属mock对象，一个代码中充斥了各种依赖的类，<br/>这些类在正常的运行中又依赖于其他类和诸多环境变量和配置。<br/>当然Groovy是个不错的语言，对于Junit的支持非常优秀，提供了MockFor和StubFor的方法来处理mock。<br/>简单易懂，不过随着测试代码烦琐的深入，问题逐渐出现了。<br/>我需要测试的一个业务类中，调用了一个读取配置的Util，<br/>当然，除非我的运行环境全部run起来才有可能读取到这个配置，否则是读取不了的。<br/>就是以为着我要mock这个读取配置的Util。<br/>这个是个很典型的Groovy范例，我当时看了doc后是这样想的。<br/>然而事实却远比我想象残酷，在我找遍了所有资料，尝试了n种做法后，<br/>突然发现一个严重的问题，所有的例子里，你要mock的对象需要生效，比如是在groovy的脚本中才可以，<br/>换句话说，我mock了一个util类，是的，我确实成功了，我在下面代码总这样使用<br/><div class="code"><br/>import groovy.mock.interceptor.MockFor<br/>class JavaGroovyTest extends GroovyTestCase{<br/> &nbsp;void firstTest(){<br/> &nbsp; &nbsp;def mock = new MockFor(JavaUtil)<br/> &nbsp; &nbsp;mock.demand.returnValue(1..2){false}//before mock, this return true<br/> &nbsp; &nbsp;mock.use{<br/> &nbsp; &nbsp; &nbsp;println(JavaUtil.retrunValue())<br/> &nbsp; &nbsp;}<br/> &nbsp;}<br/>}<br/></div><br/>如我所料的返回了false，然而当这个util被包含在一个java类写的业务逻辑总，严重问题出现了，<br/>groovy的mock无法使作用域进入class。<br/><div class="code"><br/>//java class, this is java code!<br/>public class JavaClass<br/>{<br/> &nbsp; &nbsp;public boolean doReturnValue(){<br/> &nbsp; &nbsp; &nbsp; &nbsp;return JavaUtil.returnValue();<br/> &nbsp; &nbsp;}<br/>}<br/></div><br/><div class="code"><br/>import groovy.mock.interceptor.MockFor<br/>class JavaGroovyTest extends GroovyTestCase{<br/> &nbsp;void firstTest(){<br/> &nbsp; &nbsp;def mock = new MockFor(JavaUtil)<br/> &nbsp; &nbsp;mock.demand.returnValue(1..2){false}//before mock, this return true<br/> &nbsp; &nbsp;mock.use{<br/> &nbsp; &nbsp; &nbsp;def jc = new JavaClass()<br/> &nbsp; &nbsp; &nbsp;println(jc.doReturnValue())<br/> &nbsp; &nbsp;}<br/> &nbsp;}<br/>}<br/></div><br/>返回的值依旧是true，而且抛出一个异常：<br/>junit.framework.AssertionFailedError: verify[0]: expected 1..2 call(s) to 'returnValue' but was called 0 time(s).<br/>开始还没理解这个错误究竟怎么回事，后来发现，由于所调用的returnValue是在java的class中，<br/>对于这个测试用例来说，根本就没有调到mock出来的returnValue方法，而这个方法要求至少被执行1-2次，<br/>这个执行操作没有发生，因此就抛出了这个错。<br/>如果mock根本就无法介入java的class，那么意味着使用Groovy的纯粹性大大下降，<br/>我们写测试的话，必须把java和groovy混着写才行，我想没有一个公司的代码管理者希望看到这样的情况。<br/>不知道有没有其他办法来解决这个问题，我暂时是没辙了，<br/>感觉上想让脚本进入项目还有点时间。<br/>Tags - <a href="http://www.flashot.com/blog/tag.php?tag=groovy" rel="tag">groovy</a> , <a href="http://www.flashot.com/blog/tag.php?tag=java" rel="tag">java</a>
  ]]> 
</description>
</item><item>
<link>http://www.flashot.com/blog/read.php?439</link>
<title>最近又迷上seam了</title> 
<author>xeric &lt;xeric@flashot.com&gt;</author>
<category>开发[DEV]</category>
<pubDate>Thu, 07 Aug 2008 03:26:20 +0000</pubDate> 
<guid>http://www.flashot.com/blog/read.php?439</guid> 
<description>
<![CDATA[ 
	真是佩服自己的杂食能力，<br/>又要新开辟一块战场了，不过整体来说还是对于快速开发和敏捷编程的喜爱。<br/>不过seam有一点让我不是很喜欢，前端用的是JSF。<br/>不知道是不是web bean在jsf里面运作的更好才这样选择的。<br/>我是不太喜欢看着页面里面一堆tag的，对于维护来说，无疑是噩梦。<br/>尽管ror里面也有很多tag，但是脚本语言的清晰度却要远远强于JSF这种复杂的东西。<br/>而且是事件驱动的，暂时还没看到这块的优势在什么地方，<br/>似乎更喜欢ror那种简单清晰的事件驱动模型。<br/>REST也没有摸到，还在找。<br/>不过后端的思想很不错，避免了诸多对象的转来转去。<br/>现在还有一个比较迷惑的地方，看起来entity bean能够直接进入web层是个很不错的选择，<br/>但java ee毕竟是java ee，不是ror，<br/>当我希望把web层剥离出来单独部署的时候，怎么减少entity bean的串行化传输量和解决lazy load的问题，<br/>好像还没有想明白。<br/>难道在seam bean中的注入时定义一个体积较小的vo对象在处理，似乎回到了po转vo的模式。<br/>再找找答案吧，<br/>整体来说seam值得一看，gavin king确实是个天才。<br/>Tags - <a href="http://www.flashot.com/blog/tag.php?tag=seam" rel="tag">seam</a>
  ]]> 
</description>
</item><item>
<link>http://www.flashot.com/blog/read.php?438</link>
<title>既然你支持ZD和抵制奥运，我只好和你说再见notepad++</title> 
<author>xeric &lt;xeric@flashot.com&gt;</author>
<category>信息[INFO]</category>
<pubDate>Tue, 20 May 2008 02:30:58 +0000</pubDate> 
<guid>http://www.flashot.com/blog/read.php?438</guid> 
<description>
<![CDATA[ 
	昨天本打算把notepad++推荐给别人，<br/>结果上官网首页一看，差点没吐血，居然抵制奥运，<br/>当然就是拿些什么西藏人权问题来说话了，<br/>既然如此，你喜欢地址奥运是你的爱好，我喜欢抵制你也是我的爱好，<br/>顺带让身边在用的朋友也一起和我爱好一下了。<br/>换SciTE、notepad2，也不用你了。<br/>Tags - <a href="http://www.flashot.com/blog/tag.php?tag=%E5%BF%83%E6%83%85" rel="tag">心情</a> , <a href="http://www.flashot.com/blog/tag.php?tag=%E6%8A%B5%E5%88%B6" rel="tag">抵制</a>
  ]]> 
</description>
</item><item>
<link>http://www.flashot.com/blog/read.php?437</link>
<title>打算重新启动boblog的flash相册开发</title> 
<author>xeric &lt;xeric@flashot.com&gt;</author>
<category>闪[FLASH]</category>
<pubDate>Tue, 22 Apr 2008 07:31:35 +0000</pubDate> 
<guid>http://www.flashot.com/blog/read.php?437</guid> 
<description>
<![CDATA[ 
	一直没时间管，<br/>不知道1个月后能不能稍微那么一点点的闲下来，<br/>如果有时间，就准备重新启动boblog的flash相册插件，<br/>感觉imagebox老了点，而且没法配所有的皮肤，<br/>想寻觅一下更好的flash程序进行改造，<br/>自己从头写的话估计周期会很长，而且没很好的美工支持。。。<br/><br/>我现在拖欠的任务估计已经“罄竹难书”了，感叹一下自己的拖劲，<br/>一个月后应该会公布一个新的web应用，呵呵，这边留点胃口呗。<br/>和我这个年龄段的人很有关系哦：）<br/>Tags - <a href="http://www.flashot.com/blog/tag.php?tag=%E6%8F%92%E4%BB%B6" rel="tag">插件</a>
  ]]> 
</description>
</item><item>
<link>http://www.flashot.com/blog/read.php?436</link>
<title>关于抵制</title> 
<author>xeric &lt;xeric@flashot.com&gt;</author>
<category>心情[SPIRIT]</category>
<pubDate>Mon, 21 Apr 2008 02:15:24 +0000</pubDate> 
<guid>http://www.flashot.com/blog/read.php?436</guid> 
<description>
<![CDATA[ 
	最近网上抵制消息一浪高过一浪，<br/>大家的msn也是一个个红彤彤的，包括我的，<br/>不过这次抵制真的不怎么样，个人感觉。<br/>抵制JLF的人，我不知道有多少，<br/>但是我就问一句：你们宣布自己开始抵制前，用你们的大脑好好思考了没？<br/>如果没有，恭喜你，你和被DL利用的那些ZD分子没什么区别，<br/>我不知道JLF支持DL的消息从何而来，至少，我没听到官方消息，<br/>很多人觉得官方消息保守，那请问这种空穴来风的消息就不过激了？<br/>抵制抵制，口号喊的响，不去买JLF的东西就以为自己团结了？<br/>中国的国际地位就提高了？世界就和平了？如果真有其事，法国佬就因为这种抵制行为不支持DL了？<br/>国家就富强了？人民就幸福了安康了？别的国家就看得起中国了？<br/>这个就是不用大脑思考最后导致的幼稚！<br/>这几天天天喊着口号要抵制的人，请问一下，你们中有几个能抵制一辈子的？做不到就别把自己装的很nb的爱国！<br/>法国只是一个，还有德国呢，美国呢，日本呢，你们倒是都抵制啊，干脆自闭国门吧？<br/>不夸张的讲，国际上很多有奶就是娘的国家都在和中国对着干呢，<br/>中国现在遇到的问题说明中国在国际上的低位还有待提高，<br/>但是提高不是靠抵制来做到的，“给点法国佬颜色看看，让他们见识一下中国人的力量”是这样来实现的？<br/>别让别人笑话了，中国缺乏的是自身的实力，中国经历满清到一仗后退几十年的情况，<br/>想要提高自身实力就应该静下心来搞发展，把综合国力搞上去，<br/>中国的国际地位要有足够后备支持，什么是后备支持？经济，军事，生产力这些硬实力，<br/>靠几个天天喊抵制的愤愤之辈，中国怎么提高？<br/>我不想去讨论老外是不是能在JLF的销售中攫取中国人的利润问题，<br/>只要没有违反商业法则，竞争就是必要的，<br/>把国外的企业抵制的干干净净你们就以为为中国的企业扫清障碍了？扯蛋！<br/>国内那么多企业被保护的那么好，结果不是提高到国际水平，而是拿自己人开玩笑，造点不负责任的产品。<br/>在恶劣的环境下生存，发展，超越，反击，这是每个中国人心里应该拥有的东西，卧薪尝胆，奋发图强，<br/>而不是天天叫叫抵制！<br/>任何东西需要更加包容和吸收，师夷长技以制夷，学习甚至是抄袭。<br/>很久前看到国内的Meizu搞自己的手机在德国被查了，骂声一片，说中国人只会抄，没自己的创造，<br/>你们骂的人里面有没有现在在喊抵制的？<br/>实在是搞笑，自己的技术落后人家这么多，不要寄希望于一夜超越，你们当中国是superman啊？<br/>模仿甚至是抄袭很多时候都是必经之路，问题是，我们在不在提高？国人有没有看到进步？<br/>好了，我会该申明一下我爱自己的国家了，否则又有愤青看到这个要骂我卖国贼了，虽然我不会生气而会觉得可悲。我的每一份心都在向着自己的国家，不过不是盲目的保护，而是理性的看待。<br/>理性的为国家出力，看待国家的发展，不要国家一有贪污就说国家完蛋了，国外一施压就觉得我要抵抗了。<br/>中国总是有这么一帮人唯恐天下不乱，何必呢？<br/>Tags - <a href="http://www.flashot.com/blog/tag.php?tag=%E6%8A%B5%E5%88%B6" rel="tag">抵制</a>
  ]]> 
</description>
</item><item>
<link>http://www.flashot.com/blog/read.php?435</link>
<title>狼和狗</title> 
<author>xeric &lt;xeric@flashot.com&gt;</author>
<category>心情[SPIRIT]</category>
<pubDate>Sat, 19 Jan 2008 04:30:52 +0000</pubDate> 
<guid>http://www.flashot.com/blog/read.php?435</guid> 
<description>
<![CDATA[ 
	听话的狗就能拿到吃的，安逸的活着，拿到所有的荣誉和赞赏。<br/>狼无论如何都只能靠自己的努力，在恶劣的环境下，试图生存。<br/>要有尊严的活着。<br/><br/>写在工作三年的纪念日。<br/>Tags - <a href="http://www.flashot.com/blog/tag.php?tag=%E5%BF%83%E6%83%85" rel="tag">心情</a>
  ]]> 
</description>
</item><item>
<link>http://www.flashot.com/blog/read.php?434</link>
<title>ZendFramework与symfony框架的一些比较</title> 
<author>xeric &lt;xeric@flashot.com&gt;</author>
<category>开发[DEV]</category>
<pubDate>Tue, 18 Dec 2007 02:06:08 +0000</pubDate> 
<guid>http://www.flashot.com/blog/read.php?434</guid> 
<description>
<![CDATA[ 
	最近在用两套框架做对比编码，说说我的一些感觉吧。<br/>Php的framework有点大同小异这是废话，因为php原生是不支持MVC的，<br/>所以基本所有的框架最主要的一点就是解决MVC框架的问题，<br/>两者都是通过主入口分发请求的模式来完成的。<br/>在MVC的模型设计上zendFramework更趋近于ROR，基于controller-action的模型。<br/>而symfony则是一种app+module+action的模式。<br/>你可以把symfony的module理解成为controller的一种演变模式。<br/>symfony提供了一个叫做symofony的命令行形式，前提是你要使用PEAR进行安装一些额外的东西，<br/>当然，如果不想安装也可以，不过就要用复杂的php /symfony-path/symfony这样的命令来做一些事情。<br/>zendFramework框架比起symfony的框架相对简单很多也清晰很多，对于使用者来说，<br/>你不光光要知道你运行的代码是怎么工作的，更多的是要知道内部做了什么，<br/>否则你可能连require都弄不明白。<br/>symfony则相对复杂，封装了相当多的细节，由于有脚手架，因此很多事情你只要明白怎么做，<br/>真的要深究的话，那个地方还是很绕的来着。<br/>大部分情况下，zend的代码是全部要自己写的，包括controller的继承关系，<br/>脚手架上，symfony学ror算是学的不错，从初始化安装部署到清理缓存，都可以用命令行来操作。<br/>下面提一些细节的，个人认为，认证机制上，zendframework的框架更加完美清晰，<br/>symfony把user对象继承了session对象总觉得怪怪的，而且丢了一个myUser.class.php放在lib里面，<br/>有时真觉得这个myUser有点bad smell，想改个名字都不行。<br/>权限控制上，zend通过代码完成，而symfony通过配置完成，熟悉了的话，symfony的更加统一。<br/>路径问题，有时觉得symfony的路径奇怪的不得了，但是不管怎么说还是正常工作着的，<br/>或许是我还不够熟悉的原因吧，但是zend的路径就简单很多。<br/>模板上，zend肯定推荐集成smarty了，而symfony我还没看到怎么集成。<br/>下面是最关键的一个，也是我放弃zend转向使用symfony的关键，<br/>zend不支持页面上的js的form_tag，这个意味着什么，用过ror的朋友肯定知道，<br/>对的，你所有的操作有一部分不支持js操作，例如删除，你甚至不能控制其变成一个伪js操作来保护REST路径。<br/>symfony做的不错，虽然还没ror那么完美，但是已经有了，前端也默认集成prototype，这个选择不错。<br/>还有一个就是，symfony有一个dev环境，这个环境下很有用的一个东西就是代码执行跟踪，<br/>这样将会很容易发现开发中出现的一些错误。非常有用：）<br/>by the way，symfony至今的中文文档少的可怜（不过E文的绝对不少哦）。<br/>好了，随着深入开发，我想还会有更多的体会的，以后有机会再来写。<br/>Tags - <a href="http://www.flashot.com/blog/tag.php?tag=symfony" rel="tag">symfony</a> , <a href="http://www.flashot.com/blog/tag.php?tag=php" rel="tag">php</a> , <a href="http://www.flashot.com/blog/tag.php?tag=zendframework" rel="tag">zendframework</a> , <a href="http://www.flashot.com/blog/tag.php?tag=php%E6%A1%86%E6%9E%B6" rel="tag">php框架</a>
  ]]> 
</description>
</item><item>
<link>http://www.flashot.com/blog/read.php?431</link>
<title>说明一下链接的事情</title> 
<author>xeric &lt;xeric@flashot.com&gt;</author>
<category>心情[SPIRIT]</category>
<pubDate>Sun, 28 Oct 2007 17:02:12 +0000</pubDate> 
<guid>http://www.flashot.com/blog/read.php?431</guid> 
<description>
<![CDATA[ 
	我也不喜欢没事找谁谁谁去链接一把来着，除了好朋友之外，<br/>其实我公告那边就写了，来申请链接的朋友请帮我先做好链接，<br/>如果是我找你申请的，那我肯定是要先做好的，<br/>结果经常来几个申请链接的都不做好就跑来申请，我过去一看，找不着，<br/>这样我帮你做了我还要反向通知你啊，我又不喜欢callback的接口，同步的不行么？<br/>今天看到的哥们更搞笑，说链接已经做了，让我帮他做，结果去看看人家blog，没有，<br/>我怎么感觉被开涮来着的。。。。<br/>以后这样的留言我也一起删除了啊，我觉得交换链接谁申请就先帮做好撒，<br/>我平素里面也不可能有那么多时间还去检查你们做没做我链接的，天天好多事情来着，<br/>可能有些人觉得我也太斤斤计较了，其实做个链接没啥的，<br/>可是我这边做的链接都放在首页啊，页面拉的老长可不好看。<br/>Tags - <a href="http://www.flashot.com/blog/tag.php?tag=%E5%8F%8B%E6%83%85%E9%93%BE%E6%8E%A5" rel="tag">友情链接</a>
  ]]> 
</description>
</item><item>
<link>http://www.flashot.com/blog/read.php?430</link>
<title>扁桃体发炎</title> 
<author>xeric &lt;xeric@flashot.com&gt;</author>
<category>闪[FLASH]</category>
<pubDate>Fri, 12 Oct 2007 02:23:48 +0000</pubDate> 
<guid>http://www.flashot.com/blog/read.php?430</guid> 
<description>
<![CDATA[ 
	简单说就是喉咙好疼啊~~~<br/>然后晚上睡不好，一睡好，咽了个口水，然后就疼醒了，郁闷啊。<br/>现在还慢慢出现疼的发痒的感觉，就咳嗽，咳了更疼，<br/>有时一个恶性循环，想死扛着不吃西药的来着，今早终于妥协了，<br/>去配了个什么清开灵胶囊的，然后我又额外要了一份西瓜霜，想想总能缓释一下疼痛吧。<br/>千万别生病，生病了就没激情，没追求，没理想，没力气了：（<br/>Tags - <a href="http://www.flashot.com/blog/tag.php?tag=%E7%94%9F%E7%97%85" rel="tag">生病</a>
  ]]> 
</description>
</item><item>
<link>http://www.flashot.com/blog/read.php?429</link>
<title>感冒真痛苦</title> 
<author>xeric &lt;xeric@flashot.com&gt;</author>
<category>心情[SPIRIT]</category>
<pubDate>Wed, 10 Oct 2007 03:29:49 +0000</pubDate> 
<guid>http://www.flashot.com/blog/read.php?429</guid> 
<description>
<![CDATA[ 
	直接被台风搞定了，感冒不知道要几天，我又尽量不吃西药的，<br/>只能喝喝板蓝根了，头痛的很~~<br/>站点依旧在推广中，真希望这个系统能给大众带爱足够的便利。<br/>最近天气实在无常，大家也当心点来着了。<br/>Tags - <a href="http://www.flashot.com/blog/tag.php?tag=%E5%BF%83%E6%83%85" rel="tag">心情</a>
  ]]> 
</description>
</item>
</channel>
</rss>