MoreUnit与MoreUnit

就在一年多以前,我写了一篇关于在Eclipse中使用JUnit的文章。 评论者之一推荐MoreUnit ,以进一步提高测试效率。 尝试一下让我感到很高兴,并且我的自主神经系统立即记住了该插件的键盘快捷键……

另外,在使用MoreUnit一段时间后,我发现其中一个工作例程发生了细微但值得注意的变化。 更准确地说,在重构1时 ,我倾向于提取比自己以前更多的类,这些类由自己的单元测试覆盖。 由于保持凝聚力会导致许多小类2的出现,所以这可能是一件好事。

好吧,有人可以说“ MoreUnit,名字说明了一切”,但是由于我并不希望这样使用,所以我认为这可能是一篇不错的帖子。 因此,让我们看下面的示例开始:

class ActionItem extends MouseAdapter  {private Label control;private Runnable action;private boolean mouseDown;[...]ActionItem( Composite parent, Runnable action ) {this.control = new Label( parent, SWT.NONE );this.control.addMouseListener( this );this.action = action;}@Overridepublic void mouseDown( MouseEvent event ) {markMouseDown();}@Overridepublic void mouseUp( MouseEvent event ) {handleMouseUp( event );}private void markMouseDown() {mouseDown = true;}private void handleMouseUp( MouseEvent event ) {if( mouseDown && inRange( event ) ) {action.run();}mouseDown = false;}private static boolean inRange( MouseEvent event ) {Point size = ( ( Control )event.widget).getSize();return    event.x >= 0 && event.x <= size.x && event.y >= 0 && event.y <= size.y;}[...]
}

该类是自定义UI控件3的摘录,它显示了此类控件如何实现鼠标单击行为。 我们假设我们有一个适当的单元测试用例,并且具有足够的覆盖范围并可以运行。 还可以安全地假设在到达上面的代码片段之前,已经进行了几个结构重构步骤。

将鼠标单击视为一项责任,因此应将鼠标分为自己的类。 为此,我通常从内部类开始,在该类中将相关的方法和字段移至其中。 之后,我将这种新类型的实例分配给周围类的新字段,如下面的ActionItem构造函数所示。 最后但并非最不重要的一点是,我通过将这些调用委托给新创建的字段4来修复现在未定义的方法调用:

class ActionItem extends MouseAdapter  {private Label control;private ClickHandler clickHandler;[...]ActionItem( Composite parent, Runnable action ) {this.control = new Label( parent, SWT.NONE );this.clickHandler = new ClickHandler( action );this.control.addMouseListener( this );}@Overridepublic void mouseDown( MouseEvent event ) {clickHandler.markMouseDown();}@Overridepublic void mouseUp( MouseEvent event ) {clickHandler.handleMouseUp( event );}static class ClickHandler {private Runnable action;private boolean mouseDown;ClickHandler( Runnable action ) {this.action = action;}private void markMouseDown() { [...] }private void handleMouseUp( MouseEvent event ) { [...] }private static boolean inRange( MouseEvent event ) { [...] }}[...]}

通过成功运行ActionItem的测试用例并再次检查覆盖率,可以确定上述提取没有引入任何错误。 因此,将ClickHandler最终移到其自己的文件中感觉很省钱。

但是,现在有一个类充当某种“子组件”,仅被“主”组件的测试用例间接覆盖。 我观察到,这样的阶级经常养成自己的生活。 意味着它们的功能扩展了,或者它们正在被其他类或两者重用。 在某个时间点,添加有意义的和/或易于理解的测试可能会变得相当困难。 这是因为测试类本身缺乏通过将其分为两部分而引入被测单元的内聚性。

因此,我通常立即为提取的类创建一个特定的测试用例。 甚至与MoreUnit可用一样,这可以非常直观地实现,实际上是自动为新的测试用例提供了一组基本的测试方法存根。 继续我们的例子中,我们会打开提取ClickHandler在编辑器中,按“Ctrl + J” 5在upcomming向导哪种方法,我们希望有创建存根和选择:

新测试

按Finish将创建一个正确位于项目6的相应测试源文件夹下的测试用例,根据您的MoreUnit设置,其外观如下所示:

public class ClickHandlerTest {@Testpublic void testMarkMouseDown() {fail( "Not yet implemented" );}@Testpublic void testHandleMouseUp() {fail( "Not yet implemented" );}
}

存根可以作为从头开始有意义地填充测试用例的起点。 但是请注意,已经有完整的内容提供了ActionItemTest中的一组测试。 因此,另一种可能性是将鼠标单击相关测试的内容移至新创建的ClickHandlerTest 。 尽管后者现在对新单元进行了彻底的测试,但必须注意,在ActionItemTest中还有足够的测试可确保ClickHandler 7的正确集成。

结论

现在工作了一段时间,给人的印象是代码的可维护性和进一步开发(包括测试用例)逐渐得到改善。 当然,可以说,MoreUnit不应成为决定是否将某种责任归入自己的班级的关键因素。 但是在我看来,通过帮助克服一个人较弱的自我,只需单击几下鼠标,就可以为新班级准备一个合适的测试用例,从而简化了这样做的决定。

  1. 参见“测试驱动开发”的红色/绿色/重构原理。
  2. 罗伯特·马丁(Robert C. Martin),《清洁代码》,第10章:类
  3. 尽管该示例是受我当前工作的启发,但我将其简化为本文所需的最低限度
  4. 进一步的重构步骤可能是更改ClickHandler的方式,使其扩展MouseAdapter或实现MouseListener。 之后,单击处理程序本身可以在替换操作项的标签上注册为鼠标侦听器。 这将完全消除ActionItem委派的鼠标处理程序方法。 但是我在这里省略了此步骤以保持帖子的范围
  5. 此快捷方式通常用于在被测单元及其相应的测试用例之间切换。 当您很快适应这种情况时,它以某种方式比特定的装饰者更多地充当了“缺失的测试提醒”……
  6. 对于基于OSGi的系统,这也可能是一个测试片段
  7. 请注意,提取过程简化了鼠标单击功能测试的测试设置。 提取的类不依赖于构造函数中的SWT小部件派生类,从而允许提供基于模拟的测试设置。 如果没有ActionItem麻烦,后者是不可能的,因此例如,需要使用setup / teardown方法来创建,初始化和处置Display / Shell实例。

参考:来自Code Affine博客的JCG合作伙伴 Frank Appel的MoreUnit和MoreUnit 。

翻译自: https://www.javacodegeeks.com/2014/02/more-units-with-moreunit.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js html 导出word 不用activexobject,javascript下用ActiveXObject控件替换word书签,将内容导出到word后打印第2/2页...

javascript下用ActiveXObject控件替换word书签&#xff0c;将内容导出到word后打印第2/2页更新时间&#xff1a;2008年06月21日 22:57:31 作者&#xff1a;由于时间比较紧&#xff0c;没多的时候去学习研究上述工具包&#xff0c;现在用javascript操作ActiveXObject控件&…

平时二十三测

昨日AK&#xff0c; 今日垫底&#xff0c; 我简直是在坐过山车&#xff1b; 以后记住有返回值的函数一定要写返回值&#xff0c;不然全部输出0 题解: 第一题&#xff1a;全是-1&#xff0c; 是2^(n-1)-1,不会证&#xff0c;样例很明显&#xff1b; 对于有X个跟班的人&#xff0…

20181103_C#线程初探, BeginInvoke_EndInvoke

在C#中学习多线程之前, 必须要深刻的理解委托; 基本上所有的多线程都在靠委托来完成 一. 进程和线程: a) 进程和线程都是计算机的概念, 跟程序语言没有任何关系 b) 进程和线程都属于计算机操作系统自身控制和调度, 程序语言只有使用的份, 最终的控制权还是得操作系统说了算, …

【完成发布】Lazy Line Painter – 非常有趣的 jQuery 路径动画插件

Lazy Line Painter 是基于 Raphal&#xff08;一个用于在网页中绘制矢量图形的 Javascript 库&#xff09;的 jQuery 路径动画插件&#xff0c;能够把线条图案转换为吸引眼球的路径动画模式。 您可能感兴趣的相关文章 60款非常酷的 jQuery 幻灯片演示和下载15个款优秀的 jQuer…

python构建矩阵 x y_生成Python函数一半没问题,当前最正统的代码生成是什么样的?...

机器之心原创参与&#xff1a;思源大家都说深度神经网络能力很强&#xff0c;那么从函数注释生成函数代码&#xff0c;以及从函数代码总结函数注释这种最基础的代码任务到底能不能行&#xff1f;像 Python、Java 这样的通用高级语言&#xff0c;到底在代码生成上能达到什么水平…

福大软工 · 第七次作业 - 需求分析报告(404 Note Found队)

目录 组队后的团队项目的整体计划安排项目logo及思维导图项目logo思维导图产品思维导图产品思维导图-引导产品思维导图-后端数据处理、存储产品思维导图-短信识别产品思维导图-智能分析产品思维导图-壁纸生成产品思维导图-注册界面产品思维导图-登录界面产品思维导图-使用1产品…

Web设计前沿:CSS3 在网页设计中的20个惊艳应用

作为 CSS 的下一个版本&#xff0c;CSS3 给 Web 开发带来了革命性的影响。例如&#xff0c;以前很多需要图片呈现的界面效果&#xff0c;现在使用 CSS3 结合 HTML 就可以实现&#xff0c;CSS3 甚至还可以实现需要 JavaScript 才能实现的复杂动画效果。下面向大家展示 CSS3 圆角…

Websockets与Spring 4

我将整个厨盆放入一个小型Web应用程序中&#xff0c;此应用程序是我在该帖子中开发的一部分-Spring Boot&#xff0c;Spring Integration&#xff0c;RabbitMQ&#xff0c;最后是该帖子的主题&#xff0c;Spring MVC与Spring 4中的Websocket支持。 实时地震清单应用 最终的应用…

计算机算力英语怎么说,MIT警告深度学习正逼近算力极限,突破瓶颈会让人类成为上帝?...

原标题&#xff1a;MIT警告深度学习正逼近算力极限&#xff0c;突破瓶颈会让人类成为上帝&#xff1f;摩尔定律提出的时候&#xff0c;人们从来没有想到过芯片的算力会有到达极限的一天&#xff0c;至少从来没有想到芯片算力极限会这么快到来。MIT发出警告&#xff1a;算力将探…

推荐40个简单的 jQuery 导航插件和教程【下篇】

在这篇文章中&#xff0c;我为大家收集了40款非常棒的 jQuery 导航插件和教程。导航作为网站重要的组成部分&#xff0c;能够帮助用户找到他们想要的内容&#xff0c;因此导航设计的好坏决定了用户能够在你的网站停留更长的时间&#xff0c;浏览更多的内容。在下面的集合中&…

福大软工 · 第七次作业 - 需求分析报告

【 组长博客链接】 031602428 苏路明 【计划安排】 阶段主要任务时间任务内容1项目选题09.22 - 10.10确定选题内容&#xff0c;收集用户需求&#xff0c;明确定位&#xff0c;竞品分析&#xff0c;选题报告2需求分析10.11 - 11.4梳理需求&#xff0c;输出思维导图&#xff0c;原…

网站页面左右_广州网站优化的技巧是什么?

说到网站优化&#xff0c;大家都不陌生&#xff0c;但首先&#xff0c;我们知道为什么要优化网站吗?我们网站优化是为了改善网站在百度&#xff0c;搜狗等搜索引擎搜索结果排名中的网站页面&#xff0c;以增强搜索引擎的流量。下面拓王朝广州网站优化公司小编针对网站的优化技…

python: 爬取[博海拾贝]图片脚本

练手代码&#xff0c;聊作备忘&#xff1a; # encoding: utf-8 # from __future__ import unicode_literalsimport urllib import urllib2 import re import os import time from threading import Threadclass BhsbSpider(object):_url rhttps://bh.sb/post/category/main/;_…

Java八岁生日快乐!

这是另外一段漫长的旅程&#xff0c;但是昨天&#xff0c;恰好是Java 7发布两年零七个月零十八天之后&#xff0c;我们现在有了可用于生产的构建 Java 8可供下载 &#xff01; 这个新的主要版本包含一些新功能和增强功能&#xff0c;这些功能和增强功能可以提高现有应用程序的…

精心挑选的23款美轮美奂的 jQuery 图片特效插件

jQuery是一个非常优秀的 JavaScript 框架&#xff0c;使用简单灵活&#xff0c;同时还有许多成熟的插件可供选择。其中&#xff0c;jQuery 最令人印象深刻的应用之一就是对图片的处理&#xff0c;它可以让帮助你在你的项目中加入各种精美的图片展示效果。下面向大家分享精心挑选…

arduino定时器函数如何使用_excel如何使用函数公式来查找图片

先看效果&#xff1a;是不是有点意思啊。好&#xff0c;咱们看看如何实现这样的效果。步骤一&#xff1a;准备好图片资料&#xff0c;话说巧媳妇难做无米之炊&#xff0c;没有资料&#xff0c;如何查询&#xff1f;如下图所示&#xff1a;A列是产品名称&#xff0c;B列是对应的…

精美的手机界面设计素材和线框图设计工具推荐

在制作界面原型的时候&#xff0c;如果有现成的界面基础元素可以使用的话&#xff0c;设计师就可以非常快速的完成原型的制作&#xff0c;能够节省大量的时间和精力。在这篇文章&#xff0c;我向大家分享45套非常有用的 UI 和 Wireframe 套件素材包&#xff0c;帮助设计们用于 …

c语言求数列的和_例15:C语言求Fibonacci数列的前30个数

例15&#xff1a;求Fibonacci数列的前30个数。这个数列有以下特点&#xff1a;第1,2两个数为1,1,。从第三个数开始&#xff0c;该数是其前两个数之和。&#xff08;斐波那契不死神兔&#xff09;解题思路&#xff1a;从前两个月的兔子数可以推出第3个月的兔子数。设第1个月的兔…

哈工大未来计算机院士,中国双一流大学拥有院士校友数排名,这是真实力!哈工大依然很强...

原标题&#xff1a;中国双一流大学拥有院士校友数排名&#xff0c;这是真实力&#xff01;哈工大依然很强校友是一个神奇的资源&#xff0c;就是曾经在同一个学校、大学、研究院(所)进行学习、工作和进修的人&#xff0c;就称为校友&#xff0c;以学校为标准&#xff0c;并不以…

GT sport赛道详解 - Dragon Trail | 龙之径

参考&#xff1a;GT sport所有赛道简介 今天的心情变化挺大&#xff0c;从绝望放弃到豁然开朗。 前言&#xff1a;GT sport有个排位赛&#xff0c;是每位sim赛车手提升自己等级的唯一途径&#xff0c;其中一个排位赛就是龙之径II&#xff08;逆时针跑&#xff09;&#xff0c;我…