过滤器匹配符包含单词_Hamcrest包含匹配器

过滤器匹配符包含单词

与Hamcrest 1.2相比 ,针对Matchers类的Hamcrest 1.3 Javadoc文档为该类的几种方法添加了更多文档。 例如,四个重载的contains方法具有更具描述性的Javadoc文档,如下面所示的两个比较屏幕快照所示。

尽管仅通过尝试就可以弄清楚“包含”匹配器的工作方式,但是Hamcrest 1.3中的Javadoc使阅读它们的工作方式更加容易。 大多数Java开发人员在想到contains()方法时,可能会想到类似String.contains(CharSequence)或Collection.contains(Object)的行为。 换句话说,大多数Java开发人员可能将“包含”描述为描述String / Collection是否包含提供的字符/对象以及其他可能的字符/对象。 但是,对于Hamcrest匹配器,“包含”具有更具体的含义。 随着Hamcrest 1.3文档更加清晰明了,“包含”匹配器对传递给这些方法的项目数量和项目顺序更加敏感。

我在这里显示的示例使用JUnit和Hamcrest。 在这里需要强调的是,Hamcrest的JAR文件必须在JUnit的JAR文件之前出现在单元测试的类路径中,否则我必须使用为与独立的Hamcrest JAR一起使用而构建的“特殊” JUnit JAR文件。 使用这些方法之一可以避免NoSuchMethodError和其他错误(例如org.hamcrest.Matcher.describeMismatch错误),这是由类的版本不匹配导致的。 我已经在JUnit中的博客文章Moving Beyond Core Hamcrest中撰写了有关JUnit / Hamcrest细微差别的文章。

接下来的两个屏幕快照指示了单元测试代码段的结果(如NetBeans 7.3所示),我将在稍后的博客中展示这些单元测试代码段,以演示包含匹配器的Hamcrest。 测试应该有一些失败(7个测试通过,而4个测试失败),以使Hamcrest匹配器在不阅读Javadoc的情况下可能无法按预期工作的地方很明显。 第一张图片仅显示5个测试通过,2个测试失败和4个导致错误的测试。 这是因为在NetBeans项目的“测试库”类路径中,在Hamcrest之前列出了JUnit。 第二个图像显示了预期的结果,因为Hamcrest JAR发生在项目的“测试库”类路径中的JUnit JAR之前。

为了演示的目的,我有一个简单的人工测试类。 接下来显示该Main类的源代码。

Main.java

package dustin.examples;import java.util.Collections;
import java.util.HashSet;
import java.util.Set;/*** Main class to be unit tested.* * @author Dustin*/
public class Main
{/** Uses Java 7's diamond operator. */private Set<String> strings = new HashSet<>();public Main() {}public boolean addString(final String newString){return this.strings.add(newString);}public Set<String> getStrings(){return Collections.unmodifiableSet(this.strings);}
}

显示了要测试的类之后,现在该考虑使用Hamcrest匹配器构建一些基于JUnit的测试了。 具体来说,测试是为了确保通过类的addString(String)方法添加的addString(String)位于其基础Set并且可以通过getStrings()方法访问。 接下来显示的单元测试方法演示了如何适当地使用Hamcrest匹配器来确定类的基础Set是否包含添加的字符串。

在Set Works中将Hamcrest contains()匹配器与单个字符串一起使用

/*** This test will pass because there is only a single String and so it will* contain that single String and order will be correct by implication.*/@Testpublic void testAddStringAndGetStringsWithContainsForSingleStringSoWorks(){final Main subject = new Main();final boolean resultJava = subject.addString('Java');final Set<String> strings = subject.getStrings();assertThat(strings, contains('Java'));}

上面显示的单元测试通过,是因为Set仅包含一个String,因此使用contains匹配项进行测试的String的顺序和数量匹配。

如果订单匹配,则使用具有相同数量元素的Hamcrest容器有效

/*** The 'contains' matcher expects exact ordering, which really means it should* not be used in conjunction with {@code Set}s. Typically, either this method* will work and the method with same name and '2' on end will not work or* vice versa.*/@Testpublic void testAddStringAndGetStringsWithContainsForMultipleStringsNotWorks1(){final Main subject = new Main();final boolean resultJava = subject.addString('Java');final boolean resultGroovy = subject.addString('Groovy');final Set<String> strings = subject.getStrings();assertThat(strings, contains('Java', 'Groovy'));}/*** The 'contains' matcher expects exact ordering, which really means it should* not be used in conjunction with {@code Set}s. Typically, either this method* will work and the method with same name and '1' on end will not work or* vice versa.*/@Testpublic void testAddStringAndGetStringsWithContainsForMultipleStringsNotWorks2(){final Main subject = new Main();final boolean resultJava = subject.addString('Java');final boolean resultGroovy = subject.addString('Groovy');final Set<String> strings = subject.getStrings();assertThat(strings, contains('Groovy', 'Java'));}

上面显示的两个示例单元测试以及运行这些测试的结果输出(如上一个屏幕快照所示)显示,只要contains()匹配器的参数数量与要测试的集合中的Strings数量相同, , 如果测试的元素与集合中的元素完全相同的顺序,则匹配可能有效。 对于无序的Set ,不能依赖此顺序,因此contains()不太可能与在一个以上元素的Set上进行单元测试一起使用时很好地匹配。

使用具有不同数量元素的Hamcrest容器永远行不通

/*** Demonstrate that contains will NOT pass when there is a different number* of elements asked about contains than in the collection.*/@Testpublic void testAddStringAndGetStringsWithContainsNotWorksDifferentNumberElements1(){final Main subject = new Main();final boolean resultJava = subject.addString('Java');final boolean resultGroovy = subject.addString('Groovy');final Set<String> strings = subject.getStrings();assertThat(strings, contains('Java'));}/*** Demonstrate that contains will NOT pass when there is a different number* of elements asked about contains than in the collection even when in* different order.*/@Testpublic void testAddStringAndGetStringsWithContainsNotWorksDifferentNumberElements2(){final Main subject = new Main();final boolean resultJava = subject.addString('Java');final boolean resultGroovy = subject.addString('Groovy');final Set<String> strings = subject.getStrings();assertThat(strings, contains('Groovy'));}

作为JUnit测试结果表明,这两个单元测试从未通过,因为在被测试元件的数目Set为比在元件的数量较少的Set 。 换句话说,这证明了contains()匹配器不会简单地测试集合中的给定元素:它会测试所有指定元素的存在和指定顺序。 在某些情况下,这可能太过局限了,因此现在我将继续进行Hamcrest提供的其他一些确定项,以确定特定集合中是否包含某个元素。

使用Hamcrest的containsInAnyOrder()匹配器

containsInAnyOrder匹配器不如contains()匹配器那么严格:它允许测试的元素以任何顺序通过包含集合中的元素。

/*** Test of addString and getStrings methods of class Main using Hamcrest* matcher containsInAnyOrder.*/@Testpublic void testAddStringAndGetStringsWithContainsInAnyOrder(){final Main subject = new Main();final boolean resultJava = subject.addString('Java');final boolean resultCSharp = subject.addString('C#');final boolean resultGroovy = subject.addString('Groovy');final boolean resultScala = subject.addString('Scala');final boolean resultClojure = subject.addString('Clojure');final Set<String> strings = subject.getStrings();assertThat(strings, containsInAnyOrder('Java', 'C#', 'Groovy', 'Scala', 'Clojure'));}/*** Use containsInAnyOrder and show that order does not matter as long as* all entries provided are in the collection in some order.*/@Testpublic void testAddStringAndGetStringsWithContainsInAnyOrderAgain(){final Main subject = new Main();final boolean resultJava = subject.addString('Java');final boolean resultGroovy = subject.addString('Groovy');final Set<String> strings = subject.getStrings();assertThat(strings, containsInAnyOrder('Java', 'Groovy'));assertThat(strings, containsInAnyOrder('Groovy', 'Java'));}

上方显示的两个单元测试都通过了,尽管被测试的字符串以与两个集合可能存在的顺序不同的顺序提供给containsInAnyOrder()匹配器。 但是,不太严格的containsInAnyOrder()匹配器仍要求将包含集合的所有元素指定为传递。 由于不满足此条件,因此以下单元测试未通过。

/*** This will fail because containsInAnyOrder requires all items to be matched* even if in different order. With only one element being tried and two* elements in the collection, it will still fail. In other words, order* does not matter with containsInAnyOrder, but all elements in the collection* still need to be passed to the containsInAnyOrder matcher, just not in the* exact same order.*/@Testpublic void testAddStringAndGetStringsWithContainsInAnyOrderDiffNumberElements(){final Main subject = new Main();final boolean resultJava = subject.addString('Java');final boolean resultGroovy = subject.addString('Groovy');final Set<String> strings = subject.getStrings();assertThat(strings, containsInAnyOrder('Java'));}

Hamcrest hasItem()和hasItems()匹配器像声音一样工作

如接下来的两个单元测试方法(均通过)所示,Hamcrest hasItem() (用于单个项目)和hasItems (用于多个项目)分别成功地测试了一个集合是否具有一个或多个指定项目,而无需考虑用于指定项目的订单或数量。 这实际上更像大多数Java开发人员在使用Strings和collections时“包含”工作。

/*** Demonstrate hasItem() will also work for determining a collection contains* a particular item.*/@Testpublic void testAddStringAndGetStringsWithHasItem(){final Main subject = new Main();final boolean resultJava = subject.addString('Java');final boolean resultGroovy = subject.addString('Groovy');final Set<String> strings = subject.getStrings();assertThat(strings, hasItem('Groovy'));assertThat(strings, hasItem('Java'));}/*** Demonstrate that hasItems works for determining that a collection has one* or more items and that the number of items and the order of the items* is not significant in determining pass/failure.*/@Testpublic void testAddStringAndGetStringsWithHasItems(){final Main subject = new Main();final boolean resultJava = subject.addString('Java');final boolean resultGroovy = subject.addString('Groovy');final Set<String> strings = subject.getStrings();assertThat(strings, hasItems('Groovy', 'Java'));assertThat(strings, hasItems('Java', 'Groovy'));assertThat(strings, hasItems('Groovy'));assertThat(strings, hasItems('Java'));}

Hamcrest isIn()匹配器从其他方向测试遏制

刚刚讨论过的hasItem()hasItems()匹配器不如contains()严格,甚至不如containsInAnyOrder()严格,并且经常是人们想要简单地确保一个或多个项目在集合中某处而又没有的情况下想要的关注该集合中该项目的顺序或该集合中其他可能的项目。 使用Hamcrest来确定相同关系的另一种方法是使用isIn匹配器,但从相反的角度来看。 isIn匹配器确定项目是否位于提供给匹配器的集合的某个位置,而无需考虑该项目在集合中的顺序,或者不考虑该集合中是否有其他项目。

/*** Use isIn matcher to test individual element is in provided collection.*/@Testpublic void testAddStringAndGetStringsWithIsIn(){final Main subject = new Main();final boolean resultJava = subject.addString('Java');final boolean resultGroovy = subject.addString('Groovy');final Set<String> strings = subject.getStrings();assertThat('Groovy', isIn(strings));assertThat('Java', isIn(strings));}

结论

Hamcrest提供了一组丰富的匹配器,可用于确定指定的元素是否驻留在指定的集合中。 在决定应用这些并确定使用哪个时,请记住以下重要点:

  • 确保Hamcrest JAR在JUnit JAR之前位于测试类路径上。
  • 使用contains当你想确保集合包含了所有规定的项目,没有其他物品,你想收集包含指定顺序的项目。
    • 通常应避免对Set s使用contains()匹配器,因为它们本质上是无序的。
  • 当您仍要严格测试是否在测试中指定的集合中存在完全相同的项目时,请使用containsInAnyOrder匹配器,但不必关心顺序(适用于Set )。
  • 使用hasItem()hasItems()匹配器询问集合是否包含(可能在其他未列出的项目中,并且没有特定的顺序)指定的项目。
  • 使用isIn()匹配器询问特定项是否在指定的集合中,而与其他项是否在该集合中或该项在包含的集合中的顺序无关。

参考:来自JCG合作伙伴 Dustin Marx的Hamcrest包含匹配器 ,位于Inspired by Actual Events博客上。

翻译自: https://www.javacodegeeks.com/2013/01/hamcrest-containing-matchers.html

过滤器匹配符包含单词

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

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

相关文章

linux配置4g网络命令_树莓派移动网络连接(配置4G网卡)

1、识别上网卡使用命令lsusb&#xff0c;如果能够识别则可以继续往下。2、安装网卡驱动程序上网卡一般都会带有2个功能&#xff0c;一个是虚拟光驱&#xff0c;用来安装驱动程序&#xff1b;另一个是进行网络连接的modem。在Linux下&#xff0c;需要安装usb-modeswitch驱动程序…

Hibernate 配置详解(5)

9) hibernate.batch_fetch_style: 该配置是hibernate4.2.0新添加的&#xff0c;使用这个设置可以配置hibernate在做batch-fetch的时候&#xff0c;生成SQL的策略。该配置项的可选值为org.hibernate.loader.BatchFetchStyle这个枚举类型中的可选值。所以&#xff0c;目前有三个选…

使用HazelCast进行休眠缓存:JPA缓存基础知识

HazelCast的最大功能之一就是对hibernate二级缓存的支持 。 JPA具有两个级别的缓存。 一级缓存在事务期间缓存对象的状态。 通过查询相同的对象两次&#xff0c;您必须获得第一次获取的对象。 但是&#xff0c;在包含您检索到的对象并访问数据库的复杂查询的情况下&#xff…

mvcc原理_Mysql MVCC实现原理

本文中用到的概念解释数据读取特性不可重复读指一个事务范围内两个相同的查询却返回了不同数据这是由于查询时系统中其他事务修改的提交而引起的幻读在两个连续的查找之间一个并发的修改事务修改了查询的数据集&#xff0c;导致这两个查询返回了不同的结果这是由于查询时系统中…

java数组复制的方式和效率比较

java中&#xff0c;数组的复制有以下三种方式&#xff1a; 1. 调用System.arraycopy&#xff08;Arrays.copyOfRange可以当作第四种&#xff0c;但是底层调用的是System.arraycopy&#xff0c;所以&#xff0c;认为是同一种&#xff0c;下面是Arrays.copyOfRange的方法实现&…

Java命令行界面(第18部分):JCLAP

Giles Winstanley的JCLAP &#xff08; Java命令行参数解析器 &#xff09;是基于Java的命令行处理库的系列文章中介绍的第18个库。 这篇文章的示例基于需要Java 8的 JCLAP 1.4 。 JCLAP主页上指出&#xff1a;“ JCLAP帮助Java开发人员为其应用程序创建易于使用的命令行界面。…

数据拆分_数据拆分,偏方请拿好

小伙伴们好啊&#xff0c;今天老祝和大家分享一个比较特殊的数据拆分实例。先来看一组数据&#xff1a;这是一些从系统中导出的数据&#xff0c;一个序号后面连接一个姓名&#xff0c;但是现在都挤在了一个单元格里。咱们要把这些数据变成下面的效果&#xff1a;接下来&#xf…

sql文字转换全拼_取汉字全拼的SQL函数

/*根据汉字获取全拼1.生成所有读音临时表2.根据Chinese_PRC_CS_AS_KS_WS 排序获取读音*/CREATE function f_GetPinYin(str varchar(100))returns varchar(8000)asbegindeclare re varchar(8000)--生成临时表declare t table(chr nchar(1) collate Chinese_PRC_CS_AS_KS_WS,py n…

jaxb入门_JAXB教程–入门

jaxb入门注意&#xff1a;请查看我们的Java XML绑定JAXB教程– ULTIMATE指南 什么是JAXB&#xff1f; JAXB代表用于XML绑定的Java体系结构。它用于将XML转换为java对象&#xff0c;并将java对象转换为XML。JAXB定义了一个用于在XML文档中读写Java对象的API。与SAX和DOM不同&am…

P2863 [USACO06JAN]牛的舞会The Cow Prom

题目描述 The N (2 < N < 10,000) cows are so excited: its prom night! They are dressed in their finest gowns, complete with corsages and new shoes. They know that tonight they will each try to perform the Round Dance. Only cows can perform the Round D…

call需要多大带宽 video_LTE杂谈之IMS voice 和video call流程

pan >SIP Message Logged Bytes 1951Message ID IMS_SIP_INVITEResponse Code INFORMAL_RESPONSE (0)CM Call ID 2SIP Call ID 842064754_23544448882409:8804:8000:186e:9fb:f711:a6d6:ead会话标识&#xff0c;整个流程不变Sip Message INVITEtel:10086;phone-context…

取消堆集以提高延迟并减少AWS账单

大多数性能问题可以通过几种不同的方式解决。 多数人都容易理解和应用许多适用的解决方案。 一些解决方案&#xff0c;例如从JVM管理的堆中删除某些数据结构&#xff0c;则更为复杂。 因此&#xff0c;如果您不熟悉此概念&#xff0c;我建议您继续学习我们最近如何减少应用程序…

python 环境常用指令(updating...)

# 配置pip 源 mkdir -p ~/.pip && cat >> pip.conf <<EOF [global] timeout 60 index-url https://pypi.doubanio.com/simple EOF # pyenv 安装 所需依赖&#xff1a; yum install gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel…

shell 删除了hdfs 文件,在HDFS上删除超过10天的文件

Is there a way to delete files older than 10 days on HDFS?In Linux I would use:find /path/to/directory/ -type f -mtime 10 -name *.txt -execdir rm -- {} \;Is there a way to do this on HDFS? (Deletion to be done based on file creation date)解决方案Solution…

mysql使用方法_Mysql的常用用法

一、mysql中limit的用法详解[数据分页常用]在我们使用查询语句的时候&#xff0c;经常要返回前几条或者中间某几行数据&#xff0c;这个时候怎么办呢&#xff1f;不用担心&#xff0c;mysql已经为我们提供了这样一个功能。SELECT * FROM table LIMIT [offset,] rows | rows OF…

MTK 移植泰文输入法

1.移植zi输入法 1.1 在文件..\make\XXX_GPRS.mak中 讲输入方式改为MMI_ZI XXX_LANGUAGE EN_SM_THAI INPUT_METHOD MMI_XI 1.2在MMI_feature.h 打开相应的ZI语言输入法的宏开关&#xff0c; #if defined(CFG_MMI_LANG_THAI) && ((CFG_MMI_LANG_THAI __ON__)||(CFG_MM…

java中无法推断类型参数_Java中的推断异常

java中无法推断类型参数借用和窃取其他语言的概念和想法总是很高兴的。 Scala的Option是我真正喜欢的一个主意&#xff0c;因此我用Java编写了一个实现。 它包装了一个可能为null或不为null的对象&#xff0c;并提供了一些可用于某种分类功能的方法。 例如&#xff0c;isDefine…

H3C 三种生成树协议特性的比较

转载于:https://www.cnblogs.com/fanweisheng/p/11153361.html

使用HazelCast进行休眠缓存:基本配置

以前&#xff0c;我们对JPA缓存&#xff0c;机制以及hibernate提供的内容进行了介绍 。 接下来是一个使用Hazelcast作为二级缓存的休眠项目。 为此&#xff0c;我们将在JPA中使用一个基本的spring boot项目。 Spring Boot使用休眠作为默认的JPA提供程序。 我们的设置将非常接…

mysql事务实战_mysql事务隔离级别详解和实战

A事务做了操作 没有提交 对B事务来说 就等于没做 获取的都是之前的数据但是 在A事务中查询的话 查到的都是操作之后的数据没有提交的数据只有自己看得到&#xff0c;并没有update到数据库。查看InnoDB存储引擎 系统级的隔离级别 和 会话级的隔离级别&#xff1a;mysql> sele…