热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

matchers.any_HamcrestMatchers的高级创建

matchers.any介绍上次,我讨论了HamcrestMatcher是什么,它的用法以及制作方法。在本文中,我将解释创建Hamcres
matchers.any

matchers.any

介绍

上次,我讨论了Hamcrest Matcher是什么,它的用法以及制作方法。 在本文中,我将解释创建Hamcrest Matchers的更多高级步骤。 首先,我将分享如何使您的匹配器更易于类型安全,然后介绍无状态匹配器的一些技术,最后是如何减少测试类上的大量静态导入。 我还将给出一些有关命名静态工厂方法的快速提示。

类型安全匹配器

您可能已经在上次开发的matchs()方法中注意到了,我在注释中指出,我曾使用“ yoda条件”来避免null检查和类型检查。 首先,自己对yoda条件进行一些研究不会有什么坏处(我可能有一天会发表一篇文章,但不能保证),但是这里要注意的最大事情是某种类型检查和需要空检查。 这是因为matchs()方法接受一个对象,而不是Generics参数中指定的类型。

如Hamcrest的文档中所述:

此方法与Object匹配,而不是与通用类型T匹配。这是因为Matcher的调用者在运行时不知道类型是什么(由于Java通用类型已擦除类型)。

因此,我们需要确定要传入的对象的类型。此外,我们还应确保没有传入空值(除非我们的特定Matcher可以这样做,但这非常罕见),或者在至少要确保传入的null不会导致NullPointerException。

但是有一种更简单的方法:TypeSafeMatcher。 如果扩展此类而不是BaseMatcher类,它将为您执行类型检查和null检查,然后将对象传递给仅采用泛型指定类型的匹配方法。

定义TypeSafeMatcher与我们上次定义Matcher的方法非常相似,但有一些区别:替代了match(),而不是MatchsSafely(),它接受了通用类型而不是Object; 而不是覆盖describeMismatch(),而是覆盖describeMismatchSafely()。 可能没有一个新的describeTo()可能令人惊讶,但是看到它除了Description之外不包含其他任何内容,因此不需要类型安全的版本。

否则,创建TypeSafeMatcher几乎是相同的。

不过,我不得不提我上周忘记的事情。 定义自己的匹配器的人不需要重写describeMismatch()或describeMismatchSafely()方法。 BaseMatcher和TypeSafeMatcher都具有那些方法的默认实现,这些方法仅输出“ was item.toString() ”(如果TypeSafeMatcher获得的项目类型不正确,则仅输出“ was itemClassName ( item.toString() )”)。

这些默认实现通常足够好,但是如果使用的类型没有toString()的有用实现,则使用您自己的不匹配消息来描述该项目的问题显然更有用。 即使该类具有不错的toString()实现,我也总是这样做,因为它可以更快地解决问题。

有关其他可扩展匹配器类的说明

Hamcrest核心库中还有其他几个Matcher类,供用户从中扩展。 这些有几种口味。

首先,有CustomMatcher和CustomTypeSafeMatcher。 这些设计用于通过匿名类创建一次性匹配器。 他们可能是有用的,但我更愿意总是在情况下,正确执行我曾经确实需要它一次。

接下来,有DiagnosingMatcher和TypeSafeDiagnosingMatcher,它们使您可以在match()方法中创建不匹配描述。 这似乎是用一块石头杀死两只鸟的好方法,但是我有几块牛肉:1)它违反了SRP 2)如果存在不匹配,它再次调用matchs()方法只是为了填充在不匹配说明中。 因此,第一个调用忽略获取描述,第二个调用忽略匹配。

您可以扩展的最后一个特殊的Matcher是FeatureMatcher。 这可能非常有用,但理解起来很复杂(我不确定我是否理解正确–直到我尝试自己动手做一个或阅读如何做一个为止)。 如果我弄清楚并获得了很好的理解,我将在这里为您写另一篇文章。

无状态匹配器

不需要将任何内容传递到其构造函数(因此,它是静态工厂方法)的任何Matcher都是无状态Matcher。 它们与其他Matcher相比有一个很小的优势,因为您只需要在任何时候存在一个实例,就可以在需要使用该Matcher的任何时间重用它。

这是一个非常简单的补充。 您需要做的就是创建该类的静态实例,并使您的静态工厂返回该实例,而不是调用构造函数。 库实际附带的IsEmptyString Matcher可以做到这一点(上一次我们的示例没有,但这只是为了简单起见)。

减少静态进口数量

用Hamcrest Matchers编写了相当多的测试后,您可能会注意到文件顶部有很多静态导入。 一段时间后,这可能会成为很大的麻烦事,因此,让我们看一下可以减轻此问题的方法。

实际上,这几乎与上一个解决方案一样简单。 您可以通过创建本质上为您完成的新类来减少静态导入。 这个新类具有烦人的静态导入,但随后定义了自己的静态工厂方法,这些方法委托给原始对象。 这是将一些核心Matchers组合到一个地方的示例:

import org.hamcrest.core.IsEqual;
import org.hamcrest.core.IsNull;
import org.hamcrest.core.IsSame;
import org.hamcrest.Matcher;public class CoreMatchers
{public static Matcher equalTo(T object) {return IsEqual.equalTo(object);}public static Matcher notNullValue() {return IsNull.notNullValue();}public static Matcher notNullValue(Class type) {return IsNull.notNullValue(type);}public static Matcher nullValue() {return IsNull.nullValue();}public static Matcher nullValue(Class type) {return IsNull.nullValue(type);}public static Matcher sameInstance(T target) {return IsSame.sameInstance(target);}public static Matcher theInstance(T target) {return IsSame.theInstance(target);}
}

然后,要使用任何或所有Matcher,只需静态导入CoreMatchers。*还有一种生成这些组合Matcher类的方法,如官方Hamcrest教程所示。 我不会继续讨论它,因为它不在本文讨论范围之内,而且我也不喜欢它。

结束提示:命名

如果您阅读了官方的Hamcrest教程和/或查看了内置的Matchers,您可能会注意到静态工厂方法的命名趋势。 通用语法匹配“断言testObjectfactoryMethod ”。 方法名称的语法通常设计为可以在“ is”之前使用的当前时态动作。在命名自己的静态工厂方法时,通常应遵循此约定,但实际上我建议将“ is”放入名称中已经。 这样,Matcher的用户无需将您的方法嵌套在is()方法内。 但是,如果执行此操作,则还需要创建反函数。 允许使用is()方法包装Matcher的原因是,因此您也可以将其包装在not()方法中,以测试已经测试的内容的逆函数。 这将导致类似“断言testObject不是factoryMethod ”的句子。如果您认为遵循约定对特定的Matcher来说过于严格,则只需确保使用当前的时态动作测试即可。 例如,我做了一个匹配器,检查是否抛出了一个异常,该异常的静态工厂方法是throwsA()。 我只是不喜欢将它命名为throwingA()以便与“ is”一起使用。 但是,再次,如果您违反了约定,则必须确定要创建一个静态静态工厂方法。 例如,如果您要实现自己的逆工厂,最简单的方法通常是用not()包装正工厂。 因此,我的nottThrowA()方法将返回not(throwsA())。 但是要小心:有时候,将正负错误简单地反转实际上并不能给出您想要的正确逆。

奥托罗

好吧,这就是我为您准备的。 如果您想让我进一步了解Hamcrest Matchers,请在评论中告诉我。 否则,您可以在其github页面上的Hamcrest Matchers上进行自己的研究。下周,我将讨论如何让您的Hamcrest Matchers以类似于AssertJ断言的流畅方式检查多个事情。

翻译自: https://www.javacodegeeks.com/2015/01/advanced-creation-of-hamcrest-matchers.html

matchers.any



推荐阅读
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
author-avatar
两斤
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有