`
ajoo
  • 浏览: 453130 次
社区版块
存档分类
最新评论

俺摸,俺摸,俺默默摸 (2)

阅读更多
那啥?刚才说到哪了?“如云朵般的呵护”?下面谁说的?给我拉出去好好“呵护呵护”!

人家没那么说啦!讨厌!是刚才广告里说的嘛!我说刚才我们“俺摸”系列说到哪了?
对了,说到我们可以这么用PorkMockTest:

public class LionHeadTest extends PorkMockTest {
  public void testHuoHou() {
    LionHead head = mock(LionHead.class);
    head.bite();
    replay();
    cook(head);
    // 忘记吧,忘记吧。忘记是一种幸福。能忘记的人才能快乐地吃狮子头啊!
  }
}


那要是俺老猪比较馋(好像不需要“要是”了?),就好狮子头这口,连写了八个test都要mock(LionHead.class)怎么办?俺以前都这么写:

public class LionHeadTest extends PorkMockTest {
  private final LionHead head = mock(LionHead.class);
  
  public void testEat() {...}
  public void testEatAgain() {...}
  public void testOneMorePlease() {...}
  ...
}


不过后来在喜欢作JUnit专家状的沙师弟的唠叨下,已经不敢再明目张胆地这么做了。据丫说吧:“JUnit 3.8下,所有TestCase的构造函数都是在TestSuite创建的时候调用的,所以不要在构造函数里做任何可能比较慢或者可能抛exception的动作,否则,一旦发生异常,错误信息是惨不忍睹地不知所云!!!”。在Google上搜索出来的结果也似乎站在这个喜欢冒充高手的家伙那边,让我真想打他的脸啊,打他的脸。

哎,我真想揪住某个洋洋得意写了《Test Driven Development》的人的领口,啐他一脸。凭啥非要恶心俺老猪?招你啦?

于是,俺只好捏着鼻子在这个讨厌的家伙的监督押送下返工:
class LionHeadTest extends PorkMockTest {
  private LionHead head;

  @Override protected void setUp() throws Exception {
    super.setUp();
    head = mock(LionHead.class);
  }

  ...
}


靠!这是一砣什么屎?于是,除非实在饿的不行了,俺老猪宁可在每个test里面调用一遍mock(LionHead.class)也懒得搞这么一砣东西出来。

这不?昨天听师傅讲楞加经(楞要加塞儿经?),迷迷糊糊又睡着了,等猴哥拎着耳朵(当然是他自己的耳朵,敢拎我的?哼哼,现在俺这肉可贵了,掂量着自己赔的起先!)把俺叫醒,正好听见师傅不小心把经文夹缝里的字儿给念出来几个。然后俺就觉得小腹一股热气冲上丹田,瞬间增加了几个甲子的功力。然后体力,智力,根骨,悟性都增加5点。任督二脉无师自通。这个讨厌的问题也终于找到了一个解决方案,哈哈。

长话短说,我想到了用annotation的方法。只要在PorkMockTest里面加上一点反射的咚咚,我就可以这么写了:
public class LionHeadTest extends PorkMockTest {
 @Mock  private LionHead head;
  
  public void testEat() {...}
  public void testEatAgain() {...}
  public void testOneMorePlease() {...}
  ...
}

比我原来的那个版本还爽,现在我都不用车轱辘话把LionHead说两遍了!那么PorkMockTest怎么搞的呢?南无阿弥陀佛:

@Target(FIELD)
@Retention(RUNTME)
protected @interface Mock {}

@Override public void runBare() {
  mockFields(getClass(), this);
  super.runBare();
}

private void mockFields(Class cls, Object obj) {
  Field[] fields = cls.getDecalredFields();
  for (Field field : fields) {
    if (field.getAnnotation(Mock.class) != null) {
      field.setAccessible(true);
      field.set(obj, mock(field.getType());
    }
  }
  Class superclass = cls.getSuperclass();
  if (superclass != null) {
    mockFields(superclass, obj);
  }
}


几个可能的问题回答一下:
1。为什么用runBare()而不是runTest()?因为我希望所有的@Mock fields在setUp()之前就初始化好,这样子类在setUp()里面就可以为所欲为了。
2。这样的速度是不是比较慢?毕竟每个test都要跑一下runBare(),也就都要跑一下这些反射代码?是的。真实代码是用了一个cache来缓存每个class的所有@Mock field。不过这种技术细节我就不展开了。

现在的PorkMockClass不要太好用,尤其是需要用到很多mock的类。老猪俺想吃啥就mock啥。什么龙虾,鲍鱼,燕窝,象拔蚌,都不在话下。
public class FeastTest extends PorkMockTest {
  @Mock private Lobster lobster;
  @Mock private Oyster oyster;
  @Mock private BirdNest nest;
  @Mock private ElephantNoseClam clam;

  ...
}


俺摸,俺摸,俺使劲儿摸!哈哈。
分享到:
评论
7 楼 xin73678 2008-01-21  
不好意思~刚才打错了额~!
6 楼 ajoo 2008-01-18  
yananay 写道
ajoo 写道
yananay 写道
可是你还是没回答我的第一个问题,既然有了cache,怎么保证第2个测试
一定能得到一个完整的猪肉?

cache只cache Field[]。每个测试实例都会被注射独立的mock instances。


这么说cache所作的只是 setAccessible ?
使用的时候再生成需要的 instance?
我的理解没错吧

最重要的是,不明白为什么放在 runBare 里就比放在 setup 里爽了?


缓存了Class -> Field[]这个过程,也缓存了setAccessible。这两个过程都比较昂贵的。使用的时候再生成mock instance。

放在setUp()里,害怕子类覆盖的时候忘了super.setUp()。

而runBare()一般没人会override的。
5 楼 yananay 2008-01-18  
ajoo 写道
yananay 写道
可是你还是没回答我的第一个问题,既然有了cache,怎么保证第2个测试
一定能得到一个完整的猪肉?

cache只cache Field[]。每个测试实例都会被注射独立的mock instances。


这么说cache所作的只是 setAccessible ?
使用的时候再生成需要的 instance?
我的理解没错吧

最重要的是,不明白为什么放在 runBare 里就比放在 setup 里爽了?
4 楼 ajoo 2008-01-18  
yananay 写道
可是你还是没回答我的第一个问题,既然有了cache,怎么保证第2个测试
一定能得到一个完整的猪肉?

cache只cache Field[]。每个测试实例都会被注射独立的mock instances。
3 楼 yananay 2008-01-18  
可是你还是没回答我的第一个问题,既然有了cache,怎么保证第2个测试
一定能得到一个完整的猪肉?
2 楼 ajoo 2008-01-17  
yananay 写道
引用

真实代码是用了一个cache来缓存每个class的所有@Mock field。不过这种技术细节我就不展开了。


1、如果使用cache的话,如果保证不同的测试方法不会有关联性?
   比如第一个测试方法中猪肉已经被咬一口了,第二个测试方法需要的是
   完整的猪肉,怎么恢复呢?
2、cache的控制是简单还是复杂?如果是复杂,还是用简单的方式吃猪肉
   比较爽:)

cache的接口:
Field[] getMockFields(Class<? extends TestCase>);

setAccessible()很昂贵地,所以节省还是很可观地。
1 楼 yananay 2008-01-17  
引用

真实代码是用了一个cache来缓存每个class的所有@Mock field。不过这种技术细节我就不展开了。


1、如果使用cache的话,如果保证不同的测试方法不会有关联性?
   比如第一个测试方法中猪肉已经被咬一口了,第二个测试方法需要的是
   完整的猪肉,怎么恢复呢?
2、cache的控制是简单还是复杂?如果是复杂,还是用简单的方式吃猪肉
   比较爽:)

相关推荐

    默默大学学生信息(成绩)管理系统

    本系统采用VB+acess编写,对学生成绩进行输入,查询和修改功能。另外,系统有权限限制,并且还有输入密码检测和输入超过3次则自动退出系统。。。。

    @默默默默发呆PPT设计大师个人简历ppt模板.rar

    2. 个人简历设计要点: - 自我介绍:简洁明了地介绍自己的基本信息,如姓名、联系方式、专业背景等。 - 工作经历:按时间顺序列举过往的工作经验,突出成就和职责,用数据和实例支持。 - 技能展示:列出与应聘...

    stl的3D模型在Android加载触摸旋转

    自己测试通过小例子,STL格式的3D模型,在Android里面通过触摸旋转的例子

    湖北省通山县杨芳中学高中语文学生作文因为俺是俺大亲生的素材

    在这里,“俺”作为亲生儿子,每天辛勤地劳作,无论是春耕秋收,还是拉磨打水,它总是默默地承受着。与此同时,非亲生的骡子却能够自由地享受生活,得到父亲更多的宠爱和教育资源。这种看似不公的待遇,实际上在人类...

    默默无名新观念作文.doc

    【默默无名的新观念】 在当今社会中,“默默无名”这一词汇往往被赋予了新的含义。传统上,“默默无名”可能让人联想到那些在战争年代为国家付出而不求回报的无名英雄,他们的无私奉献和坚韧精神是值得我们尊敬和...

    默默奉献的人作文.doc

    在这个世界上,存在着这样一群人,他们没有惊天动地的壮举,也没有轰轰烈烈的事迹,却以他们的默默付出,为社会的运行和人类的进步打下了坚实的基石。他们是那些在日常生活中或者特定领域中默默奉献的人,他们或许是...

    默默学课程专用播放器.exe

    默默学课程专用播放器.exe

    从默默自己向别人问怎么学PHP开始,到后来不少人又来问默默怎么学PHP

    ... ...初学者应该通过实际动手创建完整的网页来熟悉这些基础知识,实践中理解各种元素的属性和作用,这有助于形成直观的认识,而不是仅仅停留在理论层面。 ...你可以通过编写简单的脚本来实践这些概念。...

    Discuz! 默默的等待模板

    2. **响应式设计**:适应各种屏幕尺寸的设备,无论是手机、平板还是电脑,都能提供良好的视觉效果和操作体验。 3. **色彩搭配**:可能选用温和且不刺眼的色调,使得整体界面看起来舒适和谐。 4. **易用性**:按钮...

    默默网咖岗位工作流程.doc

    默默网咖岗位工作流程.doc

    Android后台开启服务默默拍照

    在Android平台上,开发人员可以利用服务(Service)组件在后台执行一些持续性的任务,比如我们的主题——在后台默默拍照。Android Service是Android四大组件之一,它允许应用在没有用户交互的情况下运行,这对于需要...

    优秀记叙文母亲默默地.doc

    2. **儿童的心理发展与社会接纳**:儿童会因为自身的与众不同而感到自卑,对周围环境的反应非常敏感。 3. **家庭环境对孩子的影响**:家庭中的困境和挑战可能塑造孩子的性格和价值观。 4. **教育的重要性**:对于...

    默默企业建站系统MoMoCMS 5.9

    《默默企业建站系统MoMoCMS 5.9——打造高效的企业在线平台》 默默企业建站系统MoMoCMS是一款专为企业用户设计的开源建站工具,它以其易用性和强大的功能深受用户喜爱,被誉为“类似WordPress的页面管理风格”的建...

    康师傅茶饮料广告策划提案默默绿茶.pptx

    康师傅茶饮料广告策划提案默默绿茶.pptx

    默默企业建站系统MoMoCMS.7z

    2. **数据库脚本**:这些脚本用于在MySQL或其他支持的数据库系统中创建必要的表和数据结构,以便存储网站内容和用户信息。 3. **模板**:模板决定了网站的外观和布局。MoMoCMS可能提供了多种预设模板,用户可以根据...

    PHP实例开发源码-MoMoCMS PHP默默企业建站系统.zip

    PHP实例开发源码—MoMoCMS PHP默默企业建站系统.zip PHP实例开发源码—MoMoCMS PHP默默企业建站系统.zip PHP实例开发源码—MoMoCMS PHP默默企业建站系统.zip

    全天候默默保护眼睛健康的软件

    为解决这一问题,应运而生了一款名为“全天候默默保护眼睛健康的软件”,它的出现,为长时间使用电脑的人们提供了一种新颖的护眼方案。 这款软件的核心优势在于其独特的自动调整屏幕色温功能。色温是指光源颜色的...

    康师傅茶饮料广告策划提案--默默绿茶.pptx

    康师傅茶饮料广告策划提案--默默绿茶.pptx

Global site tag (gtag.js) - Google Analytics