AssertJ和Awaitility是在自动代码测试中使用的两个我最喜欢的工具。 不幸的是直到最近,还不能一起使用它。 但是随后Java 8进入了游戏,几十行代码足以使其在Awaility 1.6.0中实现。

AssertJ提供了一组丰富的断言,其中包含非常有用的错误消息,所有这些消息都可以通过流畅的类型识别 API获得。 Awaitility允许表达简明异步调用的期望和易于阅读的方式利用其缩短测试时间的积极等待模式(没有更多的睡眠(5000)!)。

一年前,当我正在使用复杂事件处理 (CEP)进行算法交易项目时,就想到了将其一起使用的想法,而且我不喜欢仅针对具有Awaitility的异步测试学习Hamcrest断言。 我能够进行工作的PoC ,但是它需要在AssertJ(然后是FEST Assert)代码中进行一些重要的复制,因此我搁置了这个想法。 一个月前,我正在为4Developers会议准备有关异步代码测试的演示文稿,并问自己一个问题:Java 8如何简化Awaitility的使用?

在少数示例中,我将使用asynchronousMessageQueue消息队列,该消息可用于发送ping请求并返回接收到的数据包的数量。 用Java 7中的Awaitility(基于代理的条件除外)对其进行测试的一种方法是创建一个Callable类实例:

@Testpublic void shouldReceivePacketAfterWhileJava7Edition() {//whenasynchronousMessageQueue.sendPing();//thenawait().until(receivedPackageCount(), equalTo(1));}private Callable<Integer> receivedPackageCount() {return new Callable<Integer>() {@Overridepublic Integer call() throws Exception {return asynchronousMessageQueue.getNumberOfReceivedPackets();}};}

其中equalTo()是标准的Hamcrest匹配器。

减少冗长的第一个想法是用lambda表达式替换Callable并内联private方法:

@Testpublic void shouldReceivePacketAfterWhile() {//whenasynchronousMessageQueue.sendPing();//thenawait().until(() -> asynchronousMessageQueue.getNumberOfReceivedPackets(), equalTo(1));}

好多了。 以后的lambda表达式可以用方法参考代替:

@Testpublic void shouldReceivePacketAfterWhile() {//whenasynchronousMessageQueue.sendPing();//thenawait().until(asynchronousMessageQueue::getNumberOfReceivedPackets, equalTo(1));}

有人甚至可以进一步删除Hamcrest匹配器:

@Testpublic void shouldReceivePacketAfterWhile() {//whenasynchronousMessageQueue.sendPing();//thenawait().until(() -> asynchronousMessageQueue.getNumberOfReceivedPackets() == 1);  //poor error message}

但是尽管它仍然可以正常工作,但错误消息的意义变得不那么重要了:

ConditionTimeoutException: Condition with lambda expression in
AwaitilityAsynchronousShowCaseTest was not fulfilled within 2 seconds.

而不是很清楚:

ConditionTimeoutException: Lambda expression in AwaitilityAsynchronousShowCaseTest
that uses AbstractMessageQueueFacade: expected <1> but was <0> within 2 seconds.>

解决方案是在lambda表达式中使用AssertJ断言:

@Testpublic void shouldReceivePacketAfterWhileAssertJEdition() {//whenasynchronousMessageQueue.sendPing();//thenawait().until(() -> assertThat(asynchronousMessageQueue.getNumberOfReceivedPackets()).isEqualTo(1));}

并且由于新的AssertionCondition最初在几分钟之内就被黑客入侵,因此在Awaitility 1.6.0中成为了现实。 当然,会保留AssertJ流利的API和针对不同数据类型的有意义的故障消息。

作为奖励,所有引发AssertionError的断言(尤其是TestNG和JUnit标准断言)也可以在lambda表达式中使用(但我不知道有人知道AssertJ的功能回到了“标准”断言中)。

令人高兴的是, 更改本身利用Runnable类来实现lambda和AssertJ支持,而Awaitility 1.6.0仍与Java 5兼容。 但是,出于可读性考虑,仅在基于Java 8的项目中使用新结构才有意义。

顺便说一句,这是我在4Developers上的演讲的“ 幻灯片 ”。

翻译自: https://www.javacodegeeks.com/2014/04/using-assertj-and-awaitility-together-thanks-to-java-8-and-lambdas.html

借助Java 8和lambdas,可以一起使用AssertJ和Awaitility相关推荐

  1. lambdas_借助Java 8和lambdas,可以一起使用AssertJ和Awaitility

    lambdas AssertJ和Awaitility是在自动代码测试中使用的两个我最喜欢的工具. 不幸的是直到最近,还不能一起使用它. 但是随后Java 8进入了游戏,几十行代码足以使其在Awaili ...

  2. lambdas for_借助Java 8和lambdas,可以一起使用AssertJ和Awaitility

    lambdas for AssertJ和Awaitility是在自动代码测试中使用的两个我最喜欢的工具. 不幸的是直到最近,还不能一起使用它. 但是随后Java 8进入了游戏,几十行代码足以使其在Aw ...

  3. java8柯里化_借助Java 8实现柯里化

    在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术.这 ...

  4. MySQL8.0.11借助java程序实现增删等功能(跳坑记,功能待添加)

    网上有的那些内容我就不再赘述了,只说挡住我的几个"巨坑". (注意,以下内容仅适用于MySQL8.0级及以上版本,JDK8及以上版本,网上的例子随影的版本大多很陈旧) 一定要安装M ...

  5. Java对string按空格切分_使用Java 8流(lambdas)将空格分割为字符串

    我正在编写一个Xor方法,通过向其字符添加(作为xor操作)随机值来编写一些字符串.结果应该看起来像带有加密字符的十六进制值的字符串. 例: "Hello world"=> ...

  6. Javaslang 3.0之路

    Javaslang是一个开源的函数式库,为Java 8及以上提供了持久化的数据类型和函数式的控制结构,最近,它发布了3.0版本的路线图,这个路线图规划到了2017年的3月份: \\ \\ Javasl ...

  7. JAVA 8:Lambdas表达式初体验

    原文链接,译文链接,译者:郑旭东 Lambdas项目是即将发布(译者注:原作者写本文的时候JAVA8尚未发布)的JAVA8中重要主题,同时它应该也是众多JAVA开发者最期待的功能.还有一个非常有意思的 ...

  8. java借助Robot给微信好友自动发消息(可发送表情包)

    这个其实不光微信,QQ也是可以的,想一下平时如果想刷屏群聊,聊天不爽了想骂回去,惹女朋友生气了想不停的道歉,或者每天定时问候一下,这些如果都要自己手动操作也太麻烦了吧,还不如写一个程序解决了呢.(等等 ...

  9. 一罐将其全部统治:Arquillian + Java 8

    借助Java 8 ,已实现了许多新的语言改进,以简化开发人员的生活. 在我看来, Java 8的最大优点之一是,在某些情况下,已开发的代码看起来比使用以前的方法更漂亮,我指的是Lambdas和Meth ...

最新文章

  1. 编写MapReduce程序,统计每个买家收藏商品数量,实现统计排序功能
  2. CCNA和四级网工的对比
  3. 不能正常关机的处理办法
  4. mysql慢查询单位_MySQL慢查询
  5. 通过邮箱远程控制电脑
  6. Bootstrap mouseover 下拉菜单 Enable Hover for Bootstrap Nav Dropdowns
  7. HTTP协议发展历程
  8. Jquery学习总结(4)——高效Web开发的10个jQuery代码片段
  9. java并发库之Executors常用的创建ExecutorService的几个方法说明
  10. “21天好习惯”第一期-15
  11. matlab中fft定点运算,可用于嵌入式计算的定点FFT算法 (转载)
  12. hdr_pj410说明书_索尼HDR-PJ410
  13. 长沙云长计算机,【长沙记忆】原来关羽和长沙有这么多不解之缘
  14. vscode 设置setting文件
  15. 基于墨刀的手机壁纸app
  16. 华为手机隐藏的5个技巧,每一个值得收藏
  17. 欢迎使用CSDN-markdown编辑器范德萨发盛大发售发放时防守是大
  18. android uwb修改
  19. rabbitmq-plugins enable rabbitmq_web_stomp
  20. 原生微信登录开发记录

热门文章

  1. window7连接其他计算机的打印机,win7系统电脑怎样连接其它电脑上在打印机?
  2. delphi dll是否可用var参数_时间序列之向量自回归(VAR)学习重点
  3. nginx解析php失败,为什么nginx不能解析php?
  4. 搭建一个简单的Spring boot+maven项目
  5. 使用poi调整字体格式、添加单元格注释、自动调整列宽
  6. javafx动画_JavaFX动画工具
  7. npm 引用子项目模块_Java / Web项目中的NPM模块Browser-Sync
  8. java-ee-api_刷新器-Java EE 7概览
  9. Spring Boot删除嵌入式Tomcat服务器,启用Jetty服务器
  10. Jar Hell变得轻松–用jHades揭开类路径的神秘面纱