一年多以前,我写了一篇关于在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. 进一步的重构步骤可能是以更改MouseHandler或实现MouseListener的方式更改ClickHandler。 之后,单击处理程序本身可以在替换操作项的标签上注册为鼠标侦听器。 这将完全消除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与MoreUnit相关推荐

  1. moreunit_MoreUnit与MoreUnit

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

  2. Eclipse 插件 在线安装 收集

    Eclipse 插件 在线安装: JInto: http://www.guh-software.de/eclipse/   Properties Editor : http://propedit.so ...

  3. Eclipse 常用最新插件.标记

    Properties Editor     编辑java的属性文件,并可以自动存盘为Unicode格式 http://marketplace.eclipse.org/content/propertie ...

  4. junit测试设置不回滚_正确设置JUnit测试名称

    junit测试设置不回滚 寻找好名字是手工软件的挑战之一. 您需要随时随地找到它们-类,方法,变量,仅举几例. 但是,什么使名字成为好名字呢? 引用Oncle Bob的话:"三件事:可读性, ...

  5. 正确设置JUnit测试名称

    寻找好名字是手工软件的挑战之一. 您需要随时随地找到它们-类,方法,变量,仅举几例. 但是,什么使名字成为好名字呢? 引用Oncle Bob的话:"三件事:可读性,可读性和可读性!" ...

  6. eclipse插件大全整理学习

    Eclipse Web Tools Platform(WTP) 地址:http://download.eclipse.org/webtools/ WTP十分强大,支持HTML, JavaScript, ...

  7. eclipse插件说明

     Properties Editor Properties Editor 编辑java的属性文件,并可以自动存盘为Unicode格式 更多Properties Editor 信息  Colorer T ...

  8. Eclipse插件大全 (下)

     Quigen Quigen这个插件利用Velocity模板引擎来快速生成任何类型的文本内容.它不需要进行配置,所要做的只是利用它自带Velocity编辑器编写一个velocity 模板文件. 更多Q ...

  9. 栋的周评 | 第十三回合(定期更新、动态、架构、云技术、算法、后端、前端、收听/收看、英文、书籍、影视、好歌、新奇)

    开篇词 大家好!以下是我在 2020 年 3 月 23 日至 29 日的所见.所闻.所学和所悟. 现在,我把它们安利给你们. 已完结 Linux 管理员手册:既简单又深刻 Spring 官方指南 定期 ...

最新文章

  1. 我们是如何使用 PingCode Flow 实现研发自动化管理的?
  2. mockcpp的so加载失败问题
  3. [Go] go get获取官方库被墙解决
  4. 小程序返回上一页_智能小程序档案馆手把手教你成为小程序流量头号玩家(上)...
  5. C++ 高级篇(二)—— 名空间 (Namespaces)
  6. Exception in thread main com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport e
  7. 【面试】场景 智力题
  8. Windows Phone 的字体和语言配置支持
  9. 暴风影音去广告补丁NSIS代码开放
  10. Linux测网速工具,Linux中上下行网速测试工具 speedtest-cli
  11. 5G协议下载地址及介绍
  12. android mtk wifi 移植,【搬运】 MTK手机移植ROM及修复部分bug教程(含跨CPU)
  13. echarts实现仪表盘
  14. AR客户对账单(上月欠款)
  15. delphi写QQ消息群发(模拟按键精灵)
  16. 创意简约土木黑灰配色PPT模板
  17. ActiveX 暴漏你所有信息的可怕的插件!
  18. cgb2109-day02
  19. 用python实现颜值打分,还能测测自己的颜值
  20. 记录一次租房经历一(1)

热门文章

  1. 库(静态库和动态库)
  2. 浅谈我对JCS 的理解
  3. 一个严重损坏Excel深度修复案例
  4. 基于C语言STC89C52单片机电子密码锁的设计与仿真
  5. Linux下正则表达式和grep命令的使用
  6. python3 pycharm 远程调试 启动报错 ValueError: source code string cannot contain null bytes
  7. centos7 tomcat8 配置 java web环境 熵池不够大 启动慢问题
  8. stelnet 简介 华为ssh的另一种称呼
  9. 区块链 选择交易所 五个注意点
  10. kcp 协议分析 基于udp的可靠协议