其实在之前的文章中已经使用过 Hamcrest 匹配器框架,本篇文章将系统的介绍它的使用.

为什么要用Hamcrest匹配器框架

Hamcrest是一款软件测试框架, 可以通过现有的匹配器类检查代码中的条件.也可以通过自定义的匹配器实现.

要在JUnit中使用Hamcrest匹配器,可以用它的assertThat语句,并且可添加一个或多个匹配器.

Hamcrest一般被视作第三代匹配器框架.第一代使用断言(逻辑语句),但这样的测试不易读.第二代测试框架引入了特殊的断言方法,例如assertEquals().然而这种方式会导致编写过多类似的断言方法.Hamcrest采用了assertThat方法和匹配器表达式来确定测试是否成功,解决上述两个缺点.

Hamcrest的目标是使测试尽可能的提高可读性.例如is()方法其实就是equalTo()的包装方法.

下面的代码就是一个使用Hamcrest的案例.

package com.lulu.androidtestdemo.hamcrest;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;/*** Created by lulu on 2018/3/17.*/
public class TestHamcrest {boolean a;boolean b;@Testpublic void testHamcrest() throws Exception {//下面语句的测试目的是一致的assertThat(a, equalTo(b));assertThat(a, is(equalTo(b)));assertThat(a, is(b));}
}

下面代码比较了一下pure JUnit 4和使用Hamcrest的断言语句.

// JUnit 4 for equals check
assertEquals(expected, actual);
// Hamcrest for equals check
assertThat(actual, is(equalTo(expected)));// JUnit 4 for not equals check
assertNotEquals(expected, actual);
// Hamcrest for not equals check
assertThat(actual, is(not(equalTo(expected))));

也可以通过anyOf()等方法实现匹配器的链接.

assertThat("test", anyOf(is("testing"), containsString("est")));

通常Hamcrest的错误信息也更容易阅读.(下图为Pure JUnit 4和Hamcrest错误log的对比)

assertTrue(result instanceof String);
// error message:
java.lang.AssertionErrorat org.junit.Assert.fail(Assert.java:86)at org.junit.Assert.assertTrue(Assert.java:41)at org.junit.Assert.assertTrue(Assert.java:52)
// ...assertEquals(String.class, result.getClass());
// error message:
java.lang.NullPointerExceptionat com.vogella.hamcrest.HamcrestTest.test(HamcrestTest.java:30)
// ....assertThat(result, instanceOf(String.class));
// error message:
java.lang.AssertionError:
Expected: an instance of java.lang.Stringbut: nullat org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
// ...

使用Hamcrest匹配器也具备更高的类型安全性, 因为它们都使用了泛型.

添加Hamcrest依赖

对于Android Studio,需要在build.gradle中添加:

dependencies {// Unit testing dependenciestestImplementation 'junit:junit:4.12'// Set this dependency if you want to use Hamcrest matchingtestImplementation 'org.hamcrest:hamcrest-library:1.3'
}

使用Hamcrest

示例

Hamcrest匹配器的示例如下所示

assertThat(Long.valueOf(1), instanceOf(Integer.class));
// shortcut for instanceOf
assertThat(Long.valueOf(1), isA(Integer.class));

静态导入

使用静态导入可以使得所有匹配器都可用,更方便开发人员找到合适的匹配器.

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;

一些重要的Hamcrest匹配器

下面是一些非常重要且常用的Hamcrest匹配器

  • allOf - 所有匹配条件都匹配则通过
  • anyOf - 任何一个匹配条件匹配则通过
  • not - 与匹配条件违背则通过
  • equalTo - 使用Object.equals方法测试对象相等
  • is - 与equalTo相同,仅用来提高代码可读性
  • hasToString - 测试 Object.toString方法
  • instanceOf,isCompatibleType - 测试类型
  • notNullValue,nullValue - 测试null
  • sameInstance - 测试是否是同一实例
  • hasEntry,hasKey,hasValue - 测试一个Map包含entry,key或者value
  • hasItem,hasItems - 测试一个集合包含对应元素
  • hasItemInArray - 测试一个数组包含某个元素
  • closeTo - 测试浮点值接近于给定值
  • greaterThan, greaterThanOrEqualTo, lessThan, lessThanOrEqualTo
  • equalToIgnoringCase - 测试字符串相等且忽略大小写
  • equalToIgnoringWhiteSpace - 测试字符串相等且忽略空白符
  • containsString, endsWith, startsWith - 匹配字符串

详细请看Hamcrest API: http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html

使用Hamcrest内置的匹配器

集合匹配器测试集合

测试目标

假设存在下列代码:

List<Integer> list = Arrays.asList(5, 2, 4);

通过使用Hamcrest匹配器对这个list进行下列验证:

  • 大小为3
  • 包含2, 4, 5三个元素,忽略顺序
  • 每个元素都大于1

测试代码

@Test
public void hasSizeOf3() {List<Integer> list = Arrays.asList(5, 2, 4);assertThat(list, hasSize(3));
}
@Test
public void containsNumbersInAnyOrder() {List<Integer> list = Arrays.asList(5, 2, 4);assertThat(list, containsInAnyOrder(2, 4, 5));
}
@Test
public void everyItemGreaterThan1() {List<Integer> list = Arrays.asList(5, 2, 4);assertThat(list, everyItem(greaterThan(1)));
}

集合匹配器验证数组

测试目标

假设存在下列代码:

Integer[] ints = new Integer[] {7, 5, 12, 16};

通过使用Hamcrest匹配器对这个ints数组进行下列验证:

  • 长度为4
  • 以特定的顺序含有7, 5, 12, 16元素

测试代码

@Test
public void arrayHasSizeOf4() {Integer[] ints = new Integer[] { 7, 5, 12, 16 };assertThat(ints, arrayWithSize(4));
}
@Test
public void arrayContainsNumbersInGivenOrder() {Integer[] ints = new Integer[] { 7, 5, 12, 16 };assertThat(ints, arrayContaining(7, 5, 12, 16));
}

Hamcrest beans匹配器

测试目标

假设存在下面的类:

public class Todo {private final long id;private String summary;private String description;private int year;public Todo(long id, String summary, String description) {this.id = id;this.summary = summary;this.description = description;}//getter 和 setter
}

通过使用Hamcrest匹配器进行下列验证:

  • Todo类含有名叫 “summary”的属性
  • 如果Todo类被创建时给summary属性传入”Learn Hamcrest”, 则summary属性会用这个值进行初始化
  • 两个对象用相同的值创建,会有相同的属性值

测试代码

    @Testpublic void objectHasSummaryProperty () {Todo todo = new Todo(1, "Learn Hamcrest", "Important");assertThat(todo, hasProperty("summary"));}

<

    @Testpublic void objectHasCorrectSummaryValue () {Todo todo = new Todo(1, "Learn Hamcrest", "Important");assertThat(todo, hasProperty("summary", equalTo("Learn Hamcrest")));}
    @Testpublic void objectHasSameProperties () {Todo todo1 = new Todo(1, "Learn Hamcrest", "Important");Todo todo2 = new Todo(1, "Learn Hamcrest", "Important");assertThat(todo1, samePropertyValuesAs(todo2));}

字符串匹配器

实现下列对字符串的检查:

  • “”是一个空字符串
  • 一个给定的字符串不是空或者null
    @Testpublic void isStringEmpty() {String stringToTest = "";assertThat(stringToTest, isEmptyString());}
    @Testpublic void isStringEmptyOfNull() {String stringToTest = "";assertThat(stringToTest, isEmptyOrNullString());}

原文地址:https://blog.csdn.net/u013144863/article/details/79940039

转载于:https://www.cnblogs.com/jpfss/p/10955980.html

Hamcrest匹配器框架相关推荐

  1. Hamcrest匹配器常用方法总结

    一.Hamcrest是什么? Hamcrest is a library of matchers, which can be combined in to create flexible expres ...

  2. oppo人岗匹配测评_在测试中使用匹配器

    oppo人岗匹配测评 我们被迫在测试代码中写太多断言行的日子已经一去不复返了. 镇上有一个新的警长:assertThat和他的代理人:匹配者. 好吧,这不是什么新东西,但是无论如何,我想向您介绍匹配器 ...

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

    过滤器匹配符包含单词 与Hamcrest 1.2相比 ,针对Matchers类的Hamcrest 1.3 Javadoc文档为该类的几种方法添加了更多文档. 例如,四个重载的contains方法具有更 ...

  4. Jest 测试框架 expect 和 匹配器 matcher 的设计原理解析

    副标题:SAP Spartacus SSR 优化的单元测试分析之二 - 调用参数检测 源代码: it(`should pass parameters to the original engine in ...

  5. Jest测试框架入门之匹配器与测试异步代码

    一.匹配器 1.对于一般的数字与字符串类型使用 toBe test('adds 1 + 2 to equal 3', () => {expect(1 + 2).toBe(3); });test( ...

  6. 3D人脸查看器和匹配器

    目录 背景 技术 Mesh 文件 人脸图像 面部拟合 相机,灯光,动作 用户界面 代码高亮 演示 注意 更新 4.0版 Face Matcher的代码高亮 创建FaceServiceClient对象 ...

  7. Mockito匹配器优先

    这篇文章是意见. 让我们看一下Mockito中用于在Java中进行测试的verify方法. 示例: verify(myMock).someFunction(123) –期望在模拟ONCE上使用输入12 ...

  8. SLAM Cartographer(13)基于Ceres库的扫描匹配器

    SLAM Cartographer(13)基于Ceres库的扫描匹配器 1. 扫描匹配器 2. 残差计算 2.1. 平移残差 2.2. 角度残差 2.3. 占据空间残差 1. 扫描匹配器 通过< ...

  9. SLAM GMapping(6)扫描匹配器

    SLAM GMapping(6)扫描匹配器 1. 扫描匹配 2. 爬山优化 2.1 寻优思路 2.2 爬山初始化 2.2 爬山过程 3. 似然度和匹配度 4. 地图更新 4.1. 更新有效区域 4.2 ...

  10. easymock参数_EasyMock参数匹配器

    easymock参数 EasyMock argument matchers allow us to provide the flexible argument for matching when st ...

最新文章

  1. 根据两点间的经纬度计算距离
  2. 继承与 Data Member(2)
  3. 【The final】软件工程实践总结
  4. python pip 错误 ModuleNotFoundError: No module named pip._internal 解决办法
  5. 视频编解码器常见问题介绍
  6. 基于android的课程画图设计,基于Android的智能终端通信勘察设计系统绘图模块的设计与实现...
  7. webpack配置路径问题 1
  8. 利用ACIS、HOOPS开发三维软件
  9. 老码农的2019这一年——
  10. 一文带你弄懂 CDN 技术的原理
  11. 什么是静态代理和动态代理,两者的区别(笔记)
  12. WireGuard 教程:使用 DNS-SD 进行 NAT-to-NAT 穿透
  13. 【论文简述及翻译】A Large Dataset to Train Convolutional Networks for Disparity, Optical Flow, and SceneFlow
  14. php compress.zlib_compress/zlib(压缩/zlib)
  15. QQ聊天自动刷屏视频课程-范浩浩-专题视频课程
  16. Linux 普通用户和root用户任意切换
  17. 吐温20龙沙化工Glycosperse_L-20KFG聚氧乙烯20山梨醇酐单月桂酸酯
  18. 支付宝报错: invalid-signature 错误原因: 验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配,网关生成的验签字符串为:xxx
  19. 趣图 | 一图详解520最强脱单攻略!
  20. 单片机-嵌入式相关的一些论坛

热门文章

  1. 局域网限制网速软件_五款大学生小众有用软件,学长亲荐
  2. OpenCV2.3.1+VS2005配置方法
  3. JAVA-JDK环境变量配置
  4. TeeChart Pro VCL,提供高性能图表
  5. android自定义软键盘-中文与英文大小切换
  6. c语言tdatetime变量类型,c++ 时间类型详解(time_t和tm)
  7. WINDOWS XP下驱动开发环境设置(DDK+VC6.0)
  8. 贵州省谷歌地球高程DEM等高线下载
  9. 免費工具 - PDF转换成Flipbook, 并把它放在漂亮的书架上
  10. AutoCAD彻底卸载和清理注册表