关闭

AssertJ源码初探

标签: java源码测试AssertJ
381人阅读 评论(0) 收藏 举报
分类:

AssertJ源码初探

  AssertJ是面向java的断言工具,提供了丰富的强类型断言方法,可以与JUnit配合使用。使用AssertJ断言,能方便地写出流畅的断言表达式,如下:

assertThat(frodo.getName()).startsWith("Fro")
                       .endsWith("do")
                       .isEqualToIgnoringCase("frodo");

  AssertJ使用方便,入门简单,更多用法可参考网站:http://joel-costigliola.github.io/assertj/index.html。本文基于AssertJ 2.5.0-SNAPSHOT版本粗略分析其运行原理。

assertThat

  Assertions是AssertJ的主要操作类,Assertions提供了静态assertThat断言方法。AssertJ的便利之处在于assertThat表达式针对不同的参数类型提供对应的后续操作,使断言表达式使用起来像类型内生的表达式。assertThat方法支持所有基本类型,如int,double,string,还支持许多常用类型,如Path,InputStream,Map,Iterable。

  在实现上,Assertions以重载的方式针对不同的类型提供不同版本的assertThat方法。例如,针对boolean类型assertThat方法如下:

public static AbstractBooleanAssert<?> assertThat(boolean actual) {
    return new BooleanAssert(actual);
}

  以上,assertThat方法返回BooleanAssert对象,BooleanAssert提供了许多针对boolean类型的断言方法。同理,int类型返回IntegerAssert对象,File类型返回FileAssert对象。所有assertThat方法返回对象类型都继承AbstractAssert抽象类。

AbstractAssert

  AbstractAssert实现了Assert接口,是AssertJ框架的核心类,代表断言操作的抽象。AbstractAssert中定义了一系列通用方法,不同类型通过继承AbstractAssert实现自身的Assert类并提供各自类型的相关操作。Assert类继承图如下:

assert

  • AbstractObjectAssert:Object的断言抽象类
  • AbstractComparableAssert:基本数据类型的断言抽象类,如int,long,double,float,char等
  • AbstractArrayAssert:数组类型的断言抽象类,如BooleanArray,ByteArray,IntArray等
  • AbstractIterableAssert:迭代器类型断言抽象类

      AssertJ中提供了绝大部分常用数据类型的支持,程序可通过继承AbstractAssert类型实现自定义类型的断言操作。

连贯操作

  AssertJ另一个优点在于提供连贯的断言操作方法。在具体实现的断言类中方法只要返回自身对象引用即可,对于定义在抽象父类中的方法使用模板限定的方式提供,如下:

// S代表自身类型,A代表断言操作的类型
public interface Assert<S extends Assert<S, A>, A> extends Descriptable<S>, ExtensionPoints<S, A> {
    // 方法返回S
    S isEqualTo(Object expected);
    ......
}

  由此,所有Assert接口的实现类都包含其定义方法,方法返回自身对象。

Condition

  AssertJ提供Condition类可以自定义断言判断方法,程序需要继承Condition并实现match方法。AbstractAssert中定义is,isNot,has,doesNotHave方法进行Condition判断,AbstractObjectArrayAssert定义are,have,doNotHave,areAtLeast,haveExactly等方法进行集合条件判断。

Failures

  AssertJ当断言失败时会抛出AssertError,Assertions提供fail方法使断言失败,在调用不同类型的断言方法时,若断言失败则调用Failures的failure方法抛出AssertError,Failures提供了一些方法来满足不同场景下断言失败动作。

总结

  AssertJ提供一系列assertThat表达式简化断言动作。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

流式断言器AssertJ入门介绍

之前一直使用Junit自带的Assert类进行断言,尽管这能满足一些我们最基础的需要,但从功能上来讲还是不够强大的。 今天介绍一款功能强大的流式断言器AssertJ,所谓的流式断言就是相较于Asser...
  • mmk1992
  • mmk1992
  • 2016-08-14 17:23
  • 598

断言神器AssertJ快速入门

1.背景在设计自动化cases时,遵守的核心原则是3A(Arrange-> Actor ->Assert)原则; 断言工具的强大直接影响到用例的执行效率,本文将介绍一种流式断言神器:AssertJ。在...
  • neven7
  • neven7
  • 2016-05-18 23:04
  • 4302

推荐2个在Java编码过程好用的工具

推荐2个在编码过程中既能减少编码量,又非常容易上手的工具类:适用于Java反射和单测Assert。1 Mirror:Java反射简介官网:http://projetos.vidageek.net/mi...
  • liu251
  • liu251
  • 2015-06-04 10:08
  • 3214

单元测试断言利器 AssertJ

前言     由于JUnit的Assert是公认的烂API,所以不推荐使用,目前推荐使用的是AssertJ。 AssertJ网站: http://joel-costigliola.gith...
  • ToBeTheEnder
  • ToBeTheEnder
  • 2016-09-07 16:33
  • 1359

VB 共享软件防破解设计技术初探(二)的软件源码

  • 2011-04-09 19:08
  • 134B
  • 下载

Django 源码小剖: 初探 WSGI

python 作为一种脚本语言, 已经逐渐大量用于 web 后台开发中, 而基于 python 的 web 应用程序框架也越来越多, Bottle, Django, Flask 等等. 在一个 ...
  • yongche_shi
  • yongche_shi
  • 2015-10-30 14:09
  • 270

【Laravel】初探Laravel框架中的源码(一)

写在前面的话: 最近利用下班的空余时间看了一下Laravel框架中的源码。发现他所用到的设计方法和理念都是已经存在的。之前使用JavaWeb的时候也常用到。所以最近我想通过对框架中源...
  • da_guo_li
  • da_guo_li
  • 2017-12-09 12:16
  • 46

PHP源码初探之GCC简单介绍(三)

一、数据流分析 看一个例子 int getNumber(int x) { int n; if (x > 0) n = 1; else if (x< 0) n = -1; retur...
  • fjklq9595
  • fjklq9595
  • 2013-11-30 19:26
  • 282

Nginx源码分析 - 初探Nginx的架构

Nginx是我们日常使用非常多的一款服务器。 Nginx的源码写的非常漂亮,是c语言学习和进阶的最好的学习资料。 下面我们先看下Nginx的目录结构: Nginx的源码主要分布在src/目录下,而s...
  • initphp
  • initphp
  • 2016-01-25 19:20
  • 2123

Launcher源码初探 转载

最近研究Launcher,总结下。   主要涉及3个方面,作为Launcher源码研究的入门: 1.源码的下载; 2.源码的编译; 3.结构初探。   [下载源码] 1.下载...
  • sendling
  • sendling
  • 2013-08-03 12:11
  • 688
    个人资料
    • 访问:3981次
    • 积分:108
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档