JUnit 4.4 结合 Hamcrest 提供了一个全新的断言语法——assertThat。程序员可以只使用 assertThat 一个断言语句,结合 Hamcrest 提供的匹配符,就可以表达全部的测试思想,我们引入的版本是Junit4.12所以支持assertThat。

assertThat 的基本语法如下:

清单 1 assertThat 基本语法

assertThat( [value], [matcher statement] );

value 是接下来想要测试的变量值;

matcher statement 是使用 Hamcrest 匹配符来表达的对前面变量所期望的值的声明,如果 value 值与 matcher statement 所表达的期望值相符,则测试成功,否则测试失败。

assertThat 的优点

优点 1:以前 JUnit 提供了很多的 assertion 语句,如:assertEquals,assertNotSame,assertFalse,assertTrue,assertNotNull,assertNull 等,现在有了 JUnit 4.4,一条 assertThat 即可以替代所有的 assertion 语句,这样可以在所有的单元测试中只使用一个断言方法,使得编写测试用例变得简单,代码风格变得统一,测试代码也更容易维护。

优点 2:assertThat 使用了 Hamcrest 的 Matcher 匹配符,用户可以使用匹配符规定的匹配准则精确的指定一些想设定满足的条件,具有很强的易读性,而且使用起来更加灵活。如清单 2 所示:

清单 2 使用匹配符 Matcher 和不使用之间的比较

// 想判断某个字符串 s 是否含有子字符串 "developer" 或 "Works" 中间的一个

// JUnit 4.4 以前的版本:assertTrue(s.indexOf("developer")>-1||s.indexOf("Works")>-1 );

// JUnit 4.4:

assertThat(s, anyOf(containsString("developer"), containsString("Works")));

// 匹配符 anyOf 表示任何一个条件满足则成立,类似于逻辑或 "||", 匹配符 containsString 表示是否含有参数子

// 字符串,文章接下来会对匹配符进行具体介绍

优点 3:assertThat 不再像 assertEquals 那样,使用比较难懂的“谓宾主”语法模式(如:assertEquals(3, x);),相反,assertThat 使用了类似于“主谓宾”的易读语法模式(如:assertThat(x,is(3));),使得代码更加直观、易读。

优点 4:可以将这些 Matcher 匹配符联合起来灵活使用,达到更多目的。如清单 3 所示:

清单 3 Matcher 匹配符联合使用

// 联合匹配符not和equalTo表示“不等于”

assertThat( something, not( equalTo( "developer" ) ) );

// 联合匹配符not和containsString表示“不包含子字符串”

assertThat( something, not( containsString( "Works" ) ) );

// 联合匹配符anyOf和containsString表示“包含任何一个子字符串”

assertThat(something, anyOf(containsString("developer"), containsString("Works")));

优点 5:错误信息更加易懂、可读且具有描述性(descriptive)

JUnit 4.4 以前的版本默认出错后不会抛出额外提示信息,如:

assertTrue( s.indexOf("developer") > -1 || s.indexOf("Works") > -1 );

如果该断言出错,只会抛出无用的错误信息,如:junit.framework.AssertionFailedError:null。

如果想在出错时想打印出一些有用的提示信息,必须得程序员另外手动写,如:

assertTrue( "Expected a string containing 'developer' or 'Works'",

s.indexOf("developer") > -1 || s.indexOf("Works") > -1 );

非常的不方便,而且需要额外代码。

JUnit 4.4 会默认自动提供一些可读的描述信息,如清单 4 所示:

清单 4 JUnit 4.4 默认提供一些可读的描述性错误信息

String s = "hello world!";

assertThat( s, anyOf( containsString("developer"), containsString("Works") ) );

// 如果出错后,系统会自动抛出以下提示信息:

java.lang.AssertionError:

Expected: (a string containing "developer" or a string containing "Works")

got: "hello world!"

如何使用 assertThat

JUnit 4.4 自带了一些 Hamcrest 的匹配符 Matcher,但是只有有限的几个,在类 org.hamcrest.CoreMatchers 中定义,要想使用他们,必须导入包 org.hamcrest.CoreMatchers.*。

清单 5 列举了大部分 assertThat 的使用例子:

字符相关匹配符

/**equalTo匹配符断言被测的testedValue等于expectedValue,

* equalTo可以断言数值之间,字符串之间和对象之间是否相等,相当于Object的equals方法

*/

assertThat(testedValue, equalTo(expectedValue));

/**equalToIgnoringCase匹配符断言被测的字符串testedString

*在忽略大小写的情况下等于expectedString

*/

assertThat(testedString, equalToIgnoringCase(expectedString));

/**equalToIgnoringWhiteSpace匹配符断言被测的字符串testedString

*在忽略头尾的任意个空格的情况下等于expectedString,

*注意:字符串中的空格不能被忽略

*/

assertThat(testedString, equalToIgnoringWhiteSpace(expectedString);

/**containsString匹配符断言被测的字符串testedString包含子字符串subString**/

assertThat(testedString, containsString(subString) );

/**endsWith匹配符断言被测的字符串testedString以子字符串suffix结尾*/

assertThat(testedString, endsWith(suffix));

/**startsWith匹配符断言被测的字符串testedString以子字符串prefix开始*/

assertThat(testedString, startsWith(prefix));

一般匹配符

/**nullValue()匹配符断言被测object的值为null*/

assertThat(object,nullValue());

/**notNullValue()匹配符断言被测object的值不为null*/

assertThat(object,notNullValue());

/**is匹配符断言被测的object等于后面给出匹配表达式*/

assertThat(testedString, is(equalTo(expectedValue)));

/**is匹配符简写应用之一,is(equalTo(x))的简写,断言testedValue等于expectedValue*/

assertThat(testedValue, is(expectedValue));

/**is匹配符简写应用之二,is(instanceOf(SomeClass.class))的简写,

*断言testedObject为Cheddar的实例

*/

assertThat(testedObject, is(Cheddar.class));

/**not匹配符和is匹配符正好相反,断言被测的object不等于后面给出的object*/

assertThat(testedString, not(expectedString));

/**allOf匹配符断言符合所有条件,相当于“与”(&&)*/

assertThat(testedNumber, allOf( greaterThan(8), lessThan(16) ) );

/**anyOf匹配符断言符合条件之一,相当于“或”(||)*/

assertThat(testedNumber, anyOf( greaterThan(16), lessThan(8) ) );

数值相关匹配符

/**closeTo匹配符断言被测的浮点型数testedDouble在20.0¡À0.5范围之内*/

assertThat(testedDouble, closeTo( 20.0, 0.5 ));

/**greaterThan匹配符断言被测的数值testedNumber大于16.0*/

assertThat(testedNumber, greaterThan(16.0));

/** lessThan匹配符断言被测的数值testedNumber小于16.0*/

assertThat(testedNumber, lessThan (16.0));

/** greaterThanOrEqualTo匹配符断言被测的数值testedNumber大于等于16.0*/

assertThat(testedNumber, greaterThanOrEqualTo (16.0));

/** lessThanOrEqualTo匹配符断言被测的testedNumber小于等于16.0*/

assertThat(testedNumber, lessThanOrEqualTo (16.0));

集合相关匹配符

/**hasEntry匹配符断言被测的Map对象mapObject含有一个键值为"key"对应元素值为"value"的Entry项*/

assertThat(mapObject, hasEntry("key", "value" ) );

/**hasItem匹配符表明被测的迭代对象iterableObject含有元素element项则测试通过*/

assertThat(iterableObject, hasItem (element));

/** hasKey匹配符断言被测的Map对象mapObject含有键值“key”*/

assertThat(mapObject, hasKey ("key"));

/** hasValue匹配符断言被测的Map对象mapObject含有元素值value*/

assertThat(mapObject, hasValue(value));

java assertthat_assertThat 简介相关推荐

  1. Java EE 简介

    Java EE 简介 Java EE 基本架构 JavaEE 的诞生是为了解决传统 C/S 架构的弊端:客户端臃肿庞大,扩展性差等弊端. JavaEE 将传统的两层结构细分为了四层. 这四层分别是:C ...

  2. java程序包不存在_第一章 Java语言简介

    Java语言简介 Java之父 James Gosling(詹姆斯·高斯林) 正式诞生时间 1995年,已有二十多年历史 三大方向 JavaSE(桌面版,基础需重点掌握) JavaME(移动版,现在基 ...

  3. (一:NIO系列)JAVA NIO 简介

    出处:JAVA NIO 简介 Java 中 New I/O类库 是由 Java 1.4 引进的异步 IO.由于之前老的I/O类库是阻塞I/O,New I/O类库的目标就是要让Java支持非阻塞I/O, ...

  4. ibm java_IBM i 上Java 虚拟机简介

    Abstract IBM i 上Java 虚拟机简介 Body Java在IT业界有多流行?google上搜索一下java, 结果一目了然(今天早上我搜索到的记录数是840000000条).Java之 ...

  5. Java异常(一) Java异常简介及其架构

    概要 本章对Java中的异常进行介绍.内容包括: Java异常简介 Java异常框架 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3544168.htm ...

  6. Java:计算机编程语言Java的简介、编程环境/工具、如何学习Java之详细攻略

    Java:计算机编程语言Java的简介.编程环境/工具.如何学习Java之详细攻略 目录 Java的简介 1.Java的工作原理--基于Eclipse等编程Java语言→定义Java类→Java虚拟机 ...

  7. OpenCV Java开发简介

    OpenCV Java开发简介 OpenCV Java开发简介 我们将在本指南中做什么 获得适当的OpenCV 下载 构建 Java示例与Ant Java和Scala的SBT项目 运行SBT样本 Op ...

  8. JDK14中的java tools简介

    文章目录 故事发生了 java tools简介 jaotc jar jarsigner java javac javadoc javap jcmd jconsole jdb jdeprscan jde ...

  9. JAVA NIO 简介 (netty源码死磕1.1)

    [基础篇]netty 源码死磕1.1:  JAVA NIO简介 1. JAVA NIO简介 Java 中 New I/O类库 是由 Java 1.4 引进的异步 IO.由于之前老的I/O类库是阻塞I/ ...

最新文章

  1. AllegroPCB PDN电源分配系统分析
  2. Can I compile and run Dx11Shader for Maya 2015 on my side?
  3. Web Storage
  4. VR如何巧妙填补传统数据视觉化的漏洞
  5. python looper_入门级python线程问题
  6. Windows Service:用C#创建Windows Service
  7. idea自动生成not null判断语句
  8. Linux下如何安装最新版本工具
  9. 1694 件 AI 事件大盘点,哪些事让你记忆深刻?
  10. phoenix 根据条件更新_元旦前不必扎堆买新车!北京:出售车辆后,申请更新指标无时限...
  11. 9位工作流业内专家联袂推荐
  12. 拦截导弹问题(Noip1999)
  13. C# 三菱PLC上位机开发环境搭建
  14. python能写dnf脚本么_python dnf
  15. 00001__伊丽莎白福尔摩斯
  16. 计算机网络技术自主招生考试题,清华等17所高校2017年自主招生笔试真题
  17. 听说这两款是最适合程序员编程的电脑
  18. 配置MacTex的Tex Live Utility
  19. ABAQUS如何输出应力应变曲线(XY曲线)
  20. wordpress博客评论框添加背景图片

热门文章

  1. 伦敦金走势中一个tick是多少
  2. FlyAI图像识别类竞赛:什么蘑菇?
  3. 创乐博机器人树莓派4B
  4. emacs elisp教程
  5. Python 爬取12306火车票
  6. 圣诞来啦,编程也浪漫,用圣诞树把我们的代码装饰起来!
  7. linux硬盘狂闪,群晖提速大法之一解决内建硬盘全部读写灯一直闪烁不睡眠
  8. html+jsp 简单静态网页设计
  9. 基于Pycharm的Django学习 —— 用户管理小demo
  10. pycharm配置python2.7.6环境_Pycharm配置Python工程开发环境