1. 导读

Junit是一个可编写重复测试的简单框架,是基于Xunit架构的单元测试框架的实例。Junit4最大的改进是大量使用注解(元数据),很多实际执行过程都在Junit的后台做完了,而且写test case 的类不需要继承TestCase,只需要在所要做test case的方法前加@Test 注解即可。

JUnit 4不再要求方法的名字,可以给测试方法任意命名,但是为了可读性,还是建议以test开头命名,如JUnit 3要求的那样。

2. assertThat基本语法

2.1  首先参照常规的assert用法

import static org.junit.Assert.*;
import org.junit.Test;
    @Test
public void testAdd(){
int z=new T().add(3,5);
assertEquals(8,z);
assertTrue(z>3);
assertTrue("z is too small",z>10);
}

2.2  常用assert

assertEquals://用于判断实际值和期望值是否相同,assertEquals(预期值,实际值);
assertSame://判断实际值和期望值是否为同一个对象
assertArrayEquals(expecteds, actuals) //查看两个数组是否相等。
assertEquals(expected, actual) //查看两个对象是否相等。类似于字符串比较使用的equals()方法
assertNotEquals(first, second) //查看两个对象是否不相等。
assertNull(object) //查看对象是否为空。
assertNotNull(object) //查看对象是否不为空。
assertSame(expected, actual) //查看两个对象的引用是否相等。类似于使用“==”比较两个对象
assertNotSame(unexpected, actual) //查看两个对象的引用是否不相等。类似于使用“!=”比较两个对象
assertTrue(condition) //查看运行结果是否为true。
assertFalse(condition) //查看运行结果是否为false。
assertThat(actual, matcher) //查看实际值是否满足指定的条件
fail() //让测试失败

Hamcrest 是一个测试辅助工具,提供了一套通用的匹配符 Matcher,灵活使用这些匹配符定义的规则,程序员可以更加精确的表达自己的测试思想,

指定所想设定的测试条件。
     Junit4结合Hamcrest提供了新的断言语句-assertThat,只需一个assertThat语句,结合Hamcrest提供的匹配符,就可以表达全部的测试思想。
assertThat的基本语法如下:

assertThat(T actual, Matcher matcher)
assertThat(String reason, T actual, Matcher matcher)

3. assertThat优点

  • 统一

    只需一条assertThat语句即可替代旧有的其他语句(如assertEquals,assertNotSame,assertFalse,assertTrue,assertNotNull,assertNull等),使断言变得简单、代码风格统一,增强测试代码的可读性和可维护性。

  • 语法直观易懂

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

  • 错误信息更具描述性
    //旧的断言语法如果断言失败,默认不会有额外的提示信息,如
    assertTrue(testedString.indexOf(“taobao”) > -1);
    //如果该断言失败,只会抛出无用的错误信息,如java.lang.AssertionError: ,除此之外不会有更多的提示信息。
    //新的断言语法会默认自动提供一些可读的描述信息,如
    assertThat(testedString, containsString(“taobao”));
    //如果该断言失败,抛出的错误提示信息如下:
    Java.lang.AssertionError:
    Expected: a string containing “taobao”
    got: “taoba”
  • 跟Matcher匹配符联合使用更灵活强大

    Matcher提供了功能丰富的匹配符,assertThat结合这些匹配符使用可更灵活更准确的表达测试思想。

    // 验证字符串 s是否含有子字符串 "taobao" 或 "qa" 中间的一个
    // 旧的断言,不直观,需要分析代码逻辑明白验证意图
    assertTrue(s.indexOf("taobao")>-1||s.indexOf("qa")>-1);
    // 新的断言,直观易懂,准确表达测试思想
    assertThat(s,anyOf(containsString("taobao"),containsString("qa")));
    // anyOf满足条件之一即成立,containsString包含字符串则成立

    4. assertThat使用
         要想发挥assetThat的威力,必须跟Hamcrest联合使用,JUnit4本身包含了一些自带了一些 Hamcrest 的匹配符 Matcher,但是只有有限的几个。因此建议你将Hamcrest包加入项目。

      注意事项:
        a.必须导入JUnit4.4之后的版本才能使用assertThat方法;
        b.不需要继承TestCase类,但是需要测试方法前必须加“@Test”。
        c.需要导入Hamcrest类库:hamcrest-core-xxx.jar  |   hamcrest-library-xxx.jar
        在pom.xml文件里加入Hamcrest依赖。(Maven)
  • <dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-all</artifactId>
    <version>1.1</version>
    </dependency>

    在测试类里导入包

    import static org.junit.Assert.*;
    import static org.hamcrest.Matchers.*;

         4.1 字符相关匹配符

  • /**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));

         4.2 一般匹配符

  • /**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) ) );

         4.3 数值相关匹配符

  • /**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));

      4.4 集合相关匹配符

  • /**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.lang.SecurityException: class "org.hamcrest.Matchers"'s signer information does not match signe...解决

把原来eclipse中的junit.jar包去掉,自己引入 新的jar包

单元测试JUnit 4 (一)——keeps the bar green to keeps the code clean的更多相关文章

  1. 单元测试JUnit 4(二)——keeps the bar green to keeps the code clean

    1.Failure和Error Failure是指测试失败  Error是指测试程序本身出错  (int a=10/0) 2.JUnit常用注解 2.1 @RunWith: 可以更改测试运行器(继承o ...

  2. junit单元测试(keeps the bar green to keeps the code clean)

    error是程序错误,failure是测试错误. junit概要: JUnit是由 Erich Gamma (设计模式的创始人)和 Kent Beck (敏捷开发的创始人之一)编写的一个回归测试框架( ...

  3. keep the bar green to keep the code clean——Junit详解(一)

    测试用例 单元测试时每个开发人员必需掌握的,是保证开发过程中代码的准确性,无误性,保证代码质量.敏捷开发模式是先根据用户需求写测试用例,考虑基本所有用户所需要的情况,再写实现方法.单元测试有很多种,当 ...

  4. keep the bar green to keep the code clean——Junit详解(二)

    测试用例&测试套件 举个栗子: 编写MyStack类模拟栈,并对其进行测试用例编写测试: 编写文件删除方法,并对其删除测试. 不再做演示,戳此获取代码 MyStack类: public cla ...

  5. 菜鸟学Java(二十一)——如何更好的进行单元测试——JUnit

    测试在软件生命周期中的重要性,不用我多说想必大家也都非常清楚.软件测试有很多分类,从测试的方法上可分为:黑盒测试.白盒测试.静态测试.动态测试等:从软件开发的过程分为:单元测试.集成测试.确认测试.验 ...

  6. idea单元测试junit

    参考文章地址地址:http://blog.csdn.net/u011138533/article/details/52165577 本文按以下顺序讲解JUnit4的使用 下载jar包 单元测试初体验 ...

  7. Spring注解AOP及单元测试junit(6)

    2019-03-10/20:19:56 演示:将xml配置方式改为注解方式 静态以及动态代理推荐博客:https://blog.csdn.net/javazejian/article/details/ ...

  8. Java单元测试(Junit+Mock+代码覆盖率)---------转

    Java单元测试(Junit+Mock+代码覆盖率) 原文见此处 单元测试是编写测试代码,用来检测特定的.明确的.细颗粒的功能.单元测试并不一定保证程序功能是正确的,更不保证整体业务是准备的. 单元测 ...

  9. Java学习——单元测试JUnit

    Java学习——单元测试JUnit 摘要:本文主要介绍了什么是单元测试以及怎么进行单元测试. 部分内容来自以下博客: https://www.cnblogs.com/wxisme/p/4779193. ...

随机推荐

  1. 【BZOJ 1901】【ZJU 2112】Dynamic Rankings

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 重新用整体二分写了一下. 整体二分的思想详见论文. 貌似带修区间k大和静态区间k大都是\(O( ...

  2. 【动态规划】Round Subset

    CF837D. Round Subset Let's call the roundness of the number the number of zeros to which it ends. Yo ...

  3. matlab2016b ubuntu命令行安装 + matconvnet的安装

    0. 下载安装包 下载的文件有Matlab 2016b Linux64 Crack.rar,R2016b_glnxa64_dvd2.iso,R2016b_glnxa64_dvd1.iso. 1. 拷贝 ...

  4. Problem D: 零起点学算法95——弓型矩阵

    #include<stdio.h> #include<string.h> int main() { ][]; while(scanf("%d%d",& ...

  5. [bzoj1014](JSOI2008)火星人 prefix (Splay维护哈希)

    Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀. 比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 ...

  6. Java高级架构师(一)第31节:Nginx简介、安装和基本运行

    第一节:主要介绍Nginx和安装

  7. mysql错误 Access denied for user 'root'@'xxx.xxx.xxx.xxx' (using password: YES)

    mysql -u root -p Aaa111222333 grant all privileges on *.* to root@'%' identified by 'aaa111222333; Q ...

  8. Linux Shell编程与编辑器使用详解

    <Linux Shell编程与编辑器使用详解> 基本信息 作者: 刘丽霞 杨宇 出版社:电子工业出版社 ISBN:9787121207174 上架时间:2013-7-22 出版日期:201 ...

  9. 怎么设置IDEA,去除单词拼写检查,或者添加自定义的单词

    如图所示,添加自定义的单词,这样IDEA检查的时候,就不会报错了.估计默认是根据英文单词来释义的.

  10. ylbtech-LanguageSamples-UserConversions(用户定义的转换)

    ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-UserConversions(用户定义的转换) 1.A,示例(Sample) 返回顶部 ...