AssertJ源码初探

来源:互联网 发布:怎么恢复卡通农场数据 编辑:程序博客网 时间:2024/05/21 10:26

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
原创粉丝点击