`

Hamcrest: 编写你自己的Matcher

阅读更多
自从Junit3引进Hamcrest匹配器框架以来,对用Java写单元测试在2个方面有极大的帮助,一个是测试的可读性,一个对失败测试的信息展示。

注:Hamcrest是一个开源的编写匹配器的框架,支持多种语言,Java,Python, Object-C和Ruby。你可以在Github看到所有的源代码:https://github.com/hamcrest

Hamcrest本身自带了很多常用的Matcher, 比方说 equalTo(), notNullValue()等等, 详细的信息可以在Hamcrest的官网查询到。 除了自带的Matcher以外,Hamcrest最大优势还在于你可以轻松的编写自己需要的matcher,以增加测试代码的可读性。例如:

假设你有一个Record对象,从中你可以析取出很多的对象,你想测试析取出对象的属性都来自于这个Record对象, 按照以前的做法,我们需要获取析取出的对象的每一个属性,然后去和原Record的对性属性值比较是否相等,当面对你一个有大量属性的对象时,毫无疑问会有一大堆的get方法,一大堆的equalTo, 我们为什么不能把这样的逻辑封装起来呢? 下面我们就来看一下如何编写一个自己的Matcher。

首先,假设有如下的一个Record对象:
public class MyRecord {
    private String name;
    private int age;
    private String gender;

    private String address;
    private String phone;
    private String email;


我们会把该对象的address,phone,email属性,析取成一个Contact对象:
public Contact generateContact() {
        Contact contact = new Contact();
        contact.setEmail(email);
        contact.setPhone(phone);
        contact.setAddress(address);
        return contact;
    }


我希望的测试能够测试该析取方法,我的测试代码如下:
        @Test
        public void ContactShouldGenerateFromMyRecord() throws Exception {
            Contact contact = record.generateContact();
            assertThat(contact, is(generateFrom(record)));
        }
    
        @Test
        public void newCreateContactShouldNotGenerateFromMyRecord() throws Exception {
            Contact contact = new Contact();
            assertThat(contact, is(generateFrom(record)));
        }


这儿的generateFrom就是我定制的一个Matcher。实现一个Matcher很简单,只需要继承TypeSafeMatcher之类的Hamcrest开发出来的类,然后实现其中的abstract方法就行了。
public class GenerateFrom extends TypeSafeMatcher<Contact> {
        private MyRecord record;

        public GenerateFrom(MyRecord record) {
            this.record = record;
        }

        @Override
        public boolean matchesSafely(Contact item) {
            return StringUtils.equals(item.getAddress(),record.getAddress())
                    && StringUtils.equals(item.getEmail(),record.getEmail())
                    && StringUtils.equals(item.getPhone(),record.getPhone());
        }

        @Override
        public void describeTo(Description description) {
            description.appendValue("not extract from record");
        }

        @Factory
        public static Matcher<Contact> generateFrom(MyRecord record){
            return   new GenerateFrom(record);
        }
    }
分享到:
评论

相关推荐

    Java正则表达式:Pattern类和Matcher类

    Java正则表达式:Pattern类和Matcher类

    test-hamcrest:Java中的hamcrest断言匹配器库的示例

    hamcrest库Matcher库的简单示例 安装(Maven) 最新版本1,3:2012年7月 &lt;groupId&gt;org.hamcrest &lt;artifactId&gt;hamcrest-all &lt;scope&gt;test &lt;version&gt;1.3 没有依赖 匹配的演示文稿 第一次比赛 String s = "a ...

    Android代码-hamcrest-pojo-matcher-generator

    Hamcrest Feature Matcher Generator for POJOs Inspired by lot of dummy work to create matchers for fields in auto-generated beans to write POJO-based tests. Generates Hamcrest's Feature Matchers ...

    Go编程语言的Hamcrest匹配器-Golang开发

    软件包hamcrest.go提供了几个软件包,您可以根据需要对其进行组装:hamcrest / base:定义Matcher,Result和SelfDescribing类型,并提供工厂函数来创建它们。 (除非您要定义自己的自定义匹配器,否则,

    hamcrest-string-matcher:自定义hamcrest匹配器,用于计算子字符串的出现次数

    hamcrest-string-matcher 自定义hamcrest匹配器,用于计算子字符串的出现次数。当前的版本当前版本是0.0.5。基本用法 import static io.zinx.hamcrest.string.pattern.OccurrenceMatcher.hasOccurrenceCount;... @...

    casematch:Java 8的Matcher库

    案例匹配器 这是一个Java 8库,提供了流利的API,以面向对象和功能的方式定义大小写匹配。 该库不能替代Java中的传统switch case语句,但是可以对原始和对象引用值中的case进行更丰富的定义。 与if-then-else级联...

    实用匹配器(Matcher)小工具

    当然也可以通过扩展/实现yakoo5.matcher.Matcher接口来实现自定义的匹配器,满足业务相关的功能。 《yakoo5.matcher-1.0.zip》压缩包内文件说明: (1)Matcher/dist/yakoo5.matcher-1.0.jar - 编译后的二进制class...

    实用匹配器(Matcher)小工具 - 1.0.1

    当然也可以通过扩展/实现yakoo5.matcher.Matcher接口来实现自定义的匹配器,满足业务相关的功能。 《yakoo5.matcher-1.0.1.zip》压缩包内文件说明: (1)Matcher/dist/yakoo5.matcher-1.0.1.jar - 编译后的二...

    JAVA正则表达式--Pattern和Matcher

    现在JDK1.4里终于有了自己的正则表达式API包,JAVA程序员可以免去找第三方提供的正则表达式库的周折了,我们现在就马上来了解一下这个SUN提供的­迟来恩物- -对我来说确实如此。 1.简介: java.util.regex是一个...

    PyHamcrest, python的Hamcrest匹配器.zip

    PyHamcrest, python的Hamcrest匹配器 PyHamcrest 简介PyHamcrest是编写matcher对象的框架,允许你以声明方式定义"匹配"规则。 有很多情况,比如UI验证,或者者数据过滤,但是它在编写灵活测试的区域。 本教程

    list_matcher:Ruby正则表达式生成器

    或将其自己安装为: $ gem install list_matcher 概要 require 'list_matcher' m = List :: Matcher . new puts m . pattern %w( cat dog ) # (?:cat|dog) puts m . pattern %w( cat rat ) # (?:[cr]at) puts m ....

    正则表达式大全案例分析案例介绍

    Java中的正则表达式是一种强大的文本匹配工具,它可以用来检查和操作字符串。在Java中,正则表达式的相关类都位于java.util.regex包中。...Matcher matcher = pattern.matcher(input); boolean isMatch = matcher.fin

    cti-pattern-matcher:OASIS TC开放资料库

    要求Python 3.6+ ANTLR Python运行时(4.7+) 3) python-dateutil( ) 六个( ) stix2-patterns( ) (用于运行测试)-pytest( )安装用安装: $ pip install stix2-matcher用法安装软件包会创建一个stix2-...

    java正则表达式Pattern,Matcher

    java正则表达式Pattern,Matcher

    pattern matcher

    This is a pattern matcher in common lips. We implement the function match with two parameters: a pattern and a fact. It returns a list of variable-value bindings if the facts match the patterns while ...

    hamcrest自定义BaseMatcher

    NULL 博文链接:https://zeus-lin.iteye.com/blog/2196938

    jest-axe:自定义Jest Matcher for Axe以测试可访问性:wheelchair_symbol::joker:

    自定义 Matcher for 以测试可访问性 :warning: :raised_hand: 该项目不能保证您所构建的内容是可访问的。 GDS可访问性团队发现,只有。 诸如ax之类的工具类似于诸如或类的 :它们可以找到常见问题,但不能保证您...

    matcher:Matcher是支持globstardoublestar的快速路径Matcherglobber

    matcher与path.Match类似,但是: 支持globstar / doublestar( ** )。 提供快速的Glob功能。 支持组合匹配器。 例子 比赛 package main import "github.com/saracen/matcher" func main () { matched , err :=...

    Python库 | tfidf_matcher-0.2.1.zip

    资源分类:Python库 所属语言:Python 资源全名:tfidf_matcher-0.2.1.zip 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    PyPI 官网下载 | lyric_matcher-0.0.8.tar.gz

    资源来自pypi官网。 资源全名:lyric_matcher-0.0.8.tar.gz

Global site tag (gtag.js) - Google Analytics