场景一:
个人喜欢state-based的单元测试。(定义见mock is not stub)。
可是有些时候,比如在测试一些使用java.sql.Connection, ibatis SqlMapClient等接口的类的时候,明显写stub很不好。(1,接口很大,有很多不相干的东西。2,版本一旦变化,这些接口可能跟着变化,如果写stub的话,就意味着stub要跟着这些第三方接口变化)
于是,只好mock。只好interaction based。只好每回内部实现一变就死盯着一坨坨的expectAndReturn找不再有效的expectation。
场景二:
一个遗留系统用自己的连接池,使用ConnectionManager.checkIn(Connection)来释放连接(而不是Connection.close)
为了重构,希望能够重载Connection.close(),让它调用checkIn()。
跟场景一的提到的原因一样,不希望直接写一个MyConnection implements Connection。于是只好自己写dynamic proxy,形成如下的代码:
private Connection conn;
public Object invoke(Object proxy, Method method, Object[] args){
if((args==null || args.length==0) && method.getName().equals("close")){
ConnectionManager.checkIn((Connection)conn);
}
else {
try {
return method.invoke(conn, args);
}
catch(InvocationTargetException e){
throw e.getTargetException();
}
}
}
后面又发现这个变态的一流系统居然用自己的startMyTransaction, endMyTransaction(), rollbackMyTransaction()来搞事务处理!
于是又要继续判断method.getName().equals("startTransaction"), method.getName().equals("commitTransaction")等等等等。
dynamic proxy的代码难看的要死。
最近终于受不了了。愤然写了一个叫做酒窝的东西(dimple)。
所谓dimple,就是dynamic implementor的意思。我要用纯java语法来实现我想实现的方法(不是expectAndReturn,也不是if(method.getName().equals("method1"))),但是同时我又不愿意写“implements TheInterface”,以避免被迫处理那些我不关心的method。
用法如下:
场景一:
这样实现我的stub:
MyParameter myparam = ...;
SqlMapClient client = (SqlMapClient) Implementor.proxy(SqlMapClient.class, new Object(){
public Object insert(String id, Object param) {
assertEquals("test id", id);
assertSame(myparam, param);
return null;
}
});
assertNull(new SomeClassUsingSqlMapClient(client).runSomeInsert(myparam));
没有讨厌的expectAndReturn,不用担心parameter matcher。
场景二:
final Connection realConn = ...;
Connection conn = (Connection) Implementor.proxy(Connection.class, new Object(){
public void close() {
ConnectionManager.checkIn(realConn);
}
public void startTransaction(){
ConnectionManager.startMyTransaction(realConn);
}
public void commitTransaction(){
ConnectionManager.commitTransaction(realConn);
}
}, realConn);
于是,对close(), startTransaction, commitTransaction(),我们都直接调用ConnectionManager, 而对其它的method则委托给realConn。
这个Implementor类是纯java代码,除了dynamic proxy没有用任何其它技术。(没有enhancement,aop之类的)
个人感觉还是挺有用的。大家点评一下?
分享到:
- 2006-12-10 15:23
- 浏览 28901
- 评论(91)
- 论坛回复 / 浏览 (91 / 43559)
- 查看更多
相关推荐
设计了一种酒窝状换热板,利用Fluent软件对酒窝板、平板及波纹板的换热及压降特性进行了模拟,对这3种板在不同流速下板间流道内壁面平均换热系数、换热量、平均努塞尔数以及摩擦阻力的变化特性进行了对比分析。...
《小酒窝》教学设计是针对音乐教育领域的一份详细教案,旨在教授小学生学习和表演歌曲《小酒窝》,同时欣赏并理解乐曲《我们多么幸福》。教学目标旨在通过多样的教学方法,培养学生的音乐感知力、创造力以及对音乐...
人音三年级上册小酒窝PPT教案学习.pptx
这篇PPT是一个针对小学三年级学生的音乐学唱课程,主要教授歌曲《小酒窝》。《小酒窝》是一首充满快乐和甜美的歌曲,适合孩子们学习,以培养他们对音乐的兴趣和基本的音乐素养。 首先,课程介绍了歌曲的速度和情绪...
人音版三年级上册小酒窝PPT教案学习.pptx
这篇文档是关于三年级上册音乐课程的一个教案,教学内容为《小酒窝》这首歌,采用的是人音版教材,以五线谱的形式呈现。教学目标是让学生能够学唱这首歌曲,体验并表达出歌曲中甜美、活泼的情绪,同时激发他们对童年...
【标题】"酒窝窝DIGG类web2.0全站 -ASP源码.zip" 提供的是一款基于ASP编程语言的Web2.0网站源码,适用于构建互动性强、用户参与度高的社交平台。Web2.0是互联网发展的一个重要阶段,强调用户的交互性、共创性和分享...
【酒窝143】项目概述 "酒窝143"这个名称可能是指一个项目的代号或主题,但它本身并没有直接提供关于IT技术的知识点。不过,从提供的压缩包文件名“dimple143-master”来看,我们可以推测这可能是一个开源软件项目...
15. 酒窝性状遗传分析:儿子、儿媳均有酒窝但生出无酒窝孩子,说明他们都是杂合子(Aa),再生一个孩子有酒窝的概率为75%,无酒窝的概率为25%。 以上知识点涵盖了生物学的多个核心概念,如生物生殖、发育、遗传规律...
rcdimple | htmlwidget rcdimple是在凹坑片的版本 。 我们的目标是直接从R漂亮,可定制的d3.js图表,并且只需最少的代码并且不了解JavaScript。 首先,可以使用devtools::install_github进行安装。...
- 若有酒窝为显性,无酒窝为隐性,有酒窝的祖父母、儿子、儿媳可能基因型为Aa,孙子无酒窝则基因型为aa。 - 儿子、儿媳再次生育,有酒窝孩子的概率为50%,因为他们都是Aa,子代可能为AA或Aa,其中Aa表现为有酒窝。...
- 扩句与缩句:扩句是在简单句的基础上增加修饰词,使其更具体,如"脸蛋印着酒窝"变为"可爱的脸蛋印着迷人的酒窝";缩句则是去除修饰成分,保留句子核心,如"脸蛋印着酒窝"可以简化为"脸蛋印着酒窝"。 3. **反问...
- 小明的家庭中,如果有酒窝是显性(A),无酒窝是隐性(a),小明父亲无酒窝,因此其基因型为aa,母亲有酒窝,基因型为AA或Aa。反之,如果无酒窝是显性,有酒窝是隐性,则母亲的基因型为aa,父亲必须是Aa,因为...
使用python给你beep个"祝你生日快乐" 和 "小酒窝" 简介不够代码来凑 import winsound def winbeep_di(): winsound.Beep(1000, 100) ....此处省略500宇宙代码 if __name__ == '__main__': winbeep_di() ...
描述时,可以用比喻、拟人等修辞手法增加语言的表现力,如“笑起来非常好看,像是小酒窝里面装了酒一样”。外貌描述不仅要细致,还要力求生动、有趣,让人印象深刻。 其次,性格特征的呈现是自画像作文的重点。性格...
此外,一对无酒窝的夫妇无法生育出有酒窝的子女,因为有酒窝的基因D是显性的,而决定无酒窝的基因d是隐性的,所以无酒窝的夫妇基因型只能是dd,无法提供D基因给子女。 在能力提升环节,卷舌与非卷舌的例子进一步...
例如,"脸蛋印着酒窝"可以扩写为"可爱的脸蛋印着迷人的酒窝",缩写为"脸蛋印着酒窝"。 - **反问句与陈述句的互换**:反问句常用来强调陈述,转换时要去掉反问词,调整语气,如"我们是小学生,难道不要好好学习吗?...
3. 你笑起来的样子最为动人,两片薄薄的嘴唇在笑,长长的眼睛在笑,腮上两个陷得很举动的酒窝也在笑。 4. 青翠的柳丝,怎能比及你的秀发;碧绿涟漪,怎能比及你的眸子; 5. 你热情似火,你的微笑让我神魂颠倒 这些...
例如:“我是一个阳光的女孩,虽然谈不上特别美丽,但也不丑陋,上翘的嘴角和薄薄的嘴唇,笑起来还有浅浅的酒窝。” 3. **性格特点**:性格特征是自我介绍中的重要组成部分,能反映你的内在世界。如:“我性格热情...
例如:“每当想起我们在一起同窗时的纯真岁月,你从十岁多的小丫头始终到二十多年后的今日,总是漂美丽亮的,留着迷人的酒窝,未见过你扎辫子……,其情其景,恍如昨日!”这种描述不仅表达了写信人对美好时光的怀念...