moreunit_MoreUnit与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

moreunit

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

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

相关文章

[渝粤教育] 西南科技大学 人力资源管理 在线考试复习资料(1)

人力资源管理——在线考试复习资料 一、单选题 1.实施工作轮换方案之前要做好的工作不包括( ) A.复查每一个连续在同一职业岗位上于了5年以上.特别是更长时间的、正处于职业中期的员工(包括经理在内) 的人事文件 B.评价这些员工的工作,认清其工作专长,了解其个人特征、才干等 C…

android 获取 meid 代码,Android 各个版本获取IMEI、MEID

public class IMEIUtil {/*** 获取默认的imei 一般都是IMEI 1** param context* return*/public static String getIMEI1(Context context) {//优先获取IMEI(即使是电信卡) 不行的话就获取MEIDreturn getImeiOrMeid(context, 0);}/*** 获取imei2** param context* return*/publ…

JMetro版本5发布

Java的第5版JavaFX主题JMetro刚刚发布。 这是此版本中的新功能&#xff1a; 新的文本区域明暗风格&#xff1b; 现有控件样式的一些更改&#xff1b; 新CSS变量称为accent_color。 顾名思义&#xff0c;它允许您定义JMetro控件中使用的强调颜色。 已经进行了很大的重构&am…

[渝粤教育] 西南科技大学 会计学原理 在线考试复习资料(1)

会计学原理——在线考试复习资料 一、单选题 1.资产负债表是反映企业( )财务状况的会计报表。 A.某一特定日期 B.一定时期内 C.某一月份内 D.某一年份内 2.某企业本期盘亏的材料已查明原因,属于自然损耗,批准处理时应编制的会计分录( )。 A.借记“待处理财产损溢”,…

android 开发 矩形截屏插件,Android 上如何实现矩形区域截屏

对屏幕进行截屏并裁剪有两种方式&#xff1a;早截图和晚截图。早截图&#xff0c;就是先截取全屏&#xff0c;再让用户对截取到的图片进行修改;与之相对的&#xff0c;晚截图&#xff0c;就是先让用户在屏幕上划好区域&#xff0c;再进行截图和裁剪。其实两者并没有什么太大的区…

[渝粤教育] 西南科技大学 供应链管理 在线考试复习资料

供应链管理——在线考试复习资料 一、单选题 1.人们设置库存的目的,不包括以下哪种? A.增加固定资产 B.防止缺货 C.保持生产连续性 D.快速满足订货需求 2.费希尔(Fisher)按市场需求模式将产品分为两类,即功能性产品和创新性产品。下面属于功能性产品的是: A.时装 B.石油 C.手…

[渝粤教育] 西南科技大学 信息组织与检索 在线考试复习资料2021版

信息组织与检索——在线考试复习资料2021版 一、单选题 1.要求两个关键词至少有一个出现在检索结果中需使用的操作符是( )。 A. ND B. OR C. ND NOT D. NEAR 答案:看左边查询 2.要求两个关键词都必须出现在检索结果中需使用的操作符是( )。 A. ND B. OR C. ND NOT D. NE…

Android布局怎么画图形,Android开发者的图形化布局

图形化布局编辑器允许你通过拖放来创建UI。在早期版本的ADT中&#xff0c;图形化布局编辑器并不是很有帮助&#xff0c;幸运的是&#xff0c;最新版本非常强大&#xff0c;可以用来创建复杂的包含有复合组件以及动画的布局。(1)Configuration下拉菜单让你可以改变当前布局展示的…

java注释类型_Java 8类型注释

java注释类型Lambda表达式是迄今为止Java 8讨论最多和最受促进的功能。虽然我同意Lambda是一个很大的改进&#xff0c;但我认为其他一些Java 8功能由于Lambda的炒作而有所欠缺。 在这篇文章中&#xff0c;我想展示另一个来自Java 8的出色特性的示例&#xff1a;Type Annotation…

[渝粤教育] 西南科技大学 公共组织学 在线考试复习资料

公共组织学——在线考试复习资料 一、单选题 1.从沟通媒介自身的丰富性程度看,排在第一位的应该是( ) A.电话 B.电子邮件 C.面对面地交谈 D.文件 2.“韦伯认为,以古老的传统、神圣不可侵犯的信念,以及对其下属行使权力的人的地位的合法性为基础的权力属于( ) A.合理–合法型…

[渝粤教育] 西南科技大学 刑事诉讼法学 在线考试复习资料

刑事诉讼法学——在线考试复习资料 一、单选题 1.传唤、拘传持续的时间不得超过十二小时;案情特别重大、复杂,需要采取拘留、逮捕措施的,传唤、拘传持续的时间不得超过( )小时。 A.12 B.24 C.48 2.无期徒刑的执行机关是?( ) A.公安机关 B.监狱 C.检察机关 D.人民法院 3.讯问…

android studio简易记账本,Android记账本

十分感谢徐老师用心制作的这个视频&#xff0c;我学到了很多&#xff0c;再次感谢。这里贴一下我对着这个视频写的代码&#xff1a;https://github.com/supertian007/ImoocDaily&#xff0c;欢迎大家参考、或指出问题。记录一下学习过程中遇到的几个问题&#xff1a;1. 视频的b…

Java可选参数

在Java类中设计方法时&#xff0c;某些参数对于其执行而言可能是可选的。 无论是在DTO&#xff0c;胖模型域对象还是简单的无状态服务类中&#xff0c;可选方法参数都是常见的。 从本文中&#xff0c; 您将学习如何在Java中处理可选参数 。 我们将专注于常规方法&#xff0c;带…

[渝粤教育] 西南科技大学 单片机原理与应用 在线考试复习资料(2)

单片机原理与应用——在线考试复习资料 一、单选题 1.信息能够同时双向传送的是( )。 A.并行通信 B.单工串行通信 C.半双工串行通信 D.全双工串行通信 2.T89S52单片机片内有( )个定时器/计数器。 A.1 B.2 C.3 D.4 3.串口通信时,每秒传送120个字符,数据格式为1位起始位、8位数…

android前台进程视频教程,Android Twilio视频通话,唤醒应用程序并进入前台

因此,我们已经找到了解决方案(当收到通知时,将应用程序置于前台),即使已经有一段时间了,我仍在发布它&#xff1a;> FCM通知(firebase云消息传递通知)只需在通知中发送“数据”.因此,通知的JSON结构中没有Notification对象,只有数据.这样,通知便由您应用的FirebaseMessaging…

[渝粤教育] 西南科技大学 土木工程施工 在线考试复习资料(1)

土木工程施工——在线考试复习资料 一、单选题 1.先张法预应力筋放张时,其混凝土应到达设计强度的( )。 A.50% B.75% C.90% D.100% 2.抹灰标志块的厚度为( )。 A.底层厚度 B.中层厚度 C.底层中层厚度 D.底层中层面层厚度 3.预应力超张拉是为了( )。 A.减少预应力筋与孔道摩擦…

[渝粤教育] 西南科技大学 审计原理与实务 在线考试复习资料2021

审计原理与实务——在线考试复习资料2021 一、单选题 1. 注册会计师在执行报表审计业务中,若发现有违法行为,应当予以( )。 A.向主管部门报告 B.拒绝审计 C.向法院起诉 D.向董事会报告 答案:看左边查询 2.注册会计师从1000个应收账款明细账…

android 日期相,Android日历始终保持相同的日期

当用户签入复选框时&#xff0c;我希望闹钟响起。这是我的代码&#xff1a;if (cb1.isChecked()){Calendar calA Calendar.getInstance();//calA.set(Calendar.YEAR, Calendar.YEAR);//calA.set(Calendar.MONTH, Calendar.MONTH);//calA.set(Calendar.DAY_OF_MONTH, Calendar.…

[渝粤教育] 西南科技大学 广告学 在线考试复习资料

广告学——在线考试复习资料 一、单选题 1.下列不属于平面广告表现形式的是( ) A.漫画 B.照片 C.广告视频 D.广告画 2.下列广告媒体出现相对最早的是( ) A.电视 B.网络 C.报纸 D.户外广告牌 3.下列不属于视觉广告的是( ) A.报纸广告 B.电视广告 C.广播广告 D.霓虹灯广告 4.在…

jedis与redis_Redis与Jedis排序

jedis与redis在本文中&#xff0c;我们将讨论Redis SORT命令。 Redis提供了SORT命令&#xff0c;我们可以使用该命令从LIST&#xff0c;SET或ZSET中检索或存储排序的值。 我们可以使用最简单的形式在KEY上使用命令&#xff0c;如下例所示&#xff1a; SORT numbers_list这将…