lambdas

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

lambdas

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

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

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

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

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

  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. 2021年大数据基础(一):大数据概念
  2. capdriverconnect 黑色_【中信期货黑色(动力煤)】港口库存低位,结构性矛盾突出——周报20201101...
  3. java强制转换_java强制类型转换
  4. 韦氏评级:担心比特币近期价格走势的人都过于关注短期
  5. Mybatis全局配置文件Configuration.xml详解
  6. 【PMP】PMBOK 笔记 第11章 项目风险管理
  7. oppo手机热点Android,OPPO手机怎么开启热点?OPPO手机共享网络的三种方法
  8. idea破解失败无法打开
  9. java 播放h264_一个可以解码并实时播放H264的播放器
  10. winzip15.0注册码
  11. Docker容器dockerfile构建镜像
  12. 【深入理解计算机系统】CSAPP-实验四:ArchLab全网最详细
  13. php 如何创建一个对象,创建一个PHP对象 - BENNEE的个人空间 - OSCHINA - 中文开源技术交流社区...
  14. Android Studio+Emulator启动黑屏解决方法
  15. 中国证券业协会公布证券公司会员2006年度有关业务指标排名前20名情况
  16. 腾讯新版 Windows QQ 首个公测版发布,采用全新 QQ NT 架构
  17. zookeeper和k8s_Kubernetes(k8s)运行ZooKeeper,一个分布式系统协调器
  18. 扩充C盘(将D盘的内存分给C盘)
  19. Unreal Engin_画廊制作笔记 _008灯光处理,夜晚的画廊灯光设置
  20. python多线程突破百度云限速下载

热门文章

  1. J-Link驱动下载和JLINK下载Hex程序
  2. 使用turtlebot来实现多点导航跟踪的问题
  3. Fire uva 11624
  4. 自动释放池autoreleasepool
  5. iOS使用Charles(青花瓷)抓包并篡改返回数据图文详解
  6. lb集群lvs的3种模式
  7. 宽字符集(unicode)说明以及转换函数
  8. r语言 服务器网页版ide RStudio Server 简介
  9. linux centos 网络设置 优先使用ipv4 其次ipv6
  10. centos7 tomcat8 配置 java web环境 熵池不够大 启动慢问题