AssertJ源码初探

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AssertJ 是 JAVA 的流畅断言库。示例代码:// unique entry point to get access to all assertThat methods and utility methods (e.g. entry) import static org.assertj.core.api.Assertions.*;  // common assertionassertThat(frodo.getName()).isEqualTo("Frodo"); assertThat(frodo).isNotEqualTo(sauron)                  .isIn(fellowshipOfTheRing);  // String specific assertionassertThat(frodo.getName()).startsWith("Fro")                            .endsWith("do")                            .isEqualToIgnoringCase("frodo");  // collection specific assertionassertThat(fellowshipOfTheRing).hasSize(9)                                .contains(frodo, sam)                                .doesNotContain(sauron);  // using extracting magical feature to check fellowshipOfTheRing characters name :) assertThat(fellowshipOfTheRing).extracting("name").contains("Boromir", "Gandalf", "Frodo", "Legolas")                                                   .doesNotContain("Sauron", "Elrond");  // map specific assertions, ringBearers initialized with the elves rings and the one ring bearers. assertThat(ringBearers).hasSize(4)                        .contains(entry(oneRing, frodo), entry(nenya, galadriel))                        .doesNotContainEntry(oneRing, aragorn);  // and many more assertions : dates, file, numbers, exceptions ... 标签:AssertJ

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值