最近,我参与了一个关于twitter和google +的简短在线讨论,其中涉及一个问题,即Java 8 Lambda表达式的到来为什么使catch-exception库 1过时了。 这是由简短的声明触发的,该声明将不再维护该库,因为lambda将使其变得多余。

我当时想出的答案与 RafałBorowiec在他写得很好的文章《 JUNIT:使用JAVA 8和LAMBDA表达式测试例外》中提出的答案有很多共同点。 但是,让这两种方法都重新考虑一下,我相信就干净代码而言,甚至可以做得更好。

因此,这篇文章是对该主题的引用,它分享了我的最新考虑,并简要地解释了一个稍微完善的解决方案。 这样,我希望很快就能发现薄弱环节……

动机

在编写测试时,我总是尽力在测试方法中以清晰可见的方式将布置/动作/声明 2个阶段分离开来(我的印象是,越来越多的人通过使用空白来视觉强调这些阶段)行作为分隔符)。

现在,在我看来,上面提到的catch-exception解决方案或多或少地将行为断言阶段混合在一起。 这是因为两个都声称Throwable在仍处于动作阶段时已被抛出。 但是断言显然属于断言阶段。

幸运的是,这个问题很容易解决。

细化

让我们看一个简单的示例,以解释改进的方法的外观。 我从一个类开始,该类提供了一个IllegalStateException的方法以进行演示:

public class Foo {static final String ERR_MESSAGE = "bad";public void doIt() throws IllegalStateException {throw new IllegalStateException(ERR_MESSAGE);}
}

下一个代码片段引入了一个小助手,该助手负责捕获在JUnit测试的操作阶段抛出的Throwable 。 请注意,它本身不会声明任何内容。 它仅返回捕获的Throwable如果有),否则返回null

public class ThrowableCaptor {public interface Actor {void act() throws Throwable;}public static Throwable captureThrowable( Actor actor ) {Throwable result = null;try {actor.act();} catch( Throwable throwable ) {result = throwable;}return result;}
}

为了强调ThrowableCaptor用于处理JUnit Test的动作阶段, captorThrowable方法采用了Actor类型的参数–诚然,它可能会比喻过期一些……

无论如何,有了该实用程序, AssertJ用于干净的匹配器表达式,静态导入和手头的Java 8 lambda,异常测试可能看起来像这样:

public class FooTest {@Testpublic void testException() {// arrangeFoo foo = new Foo();// actThrowable actual = captureThrowable( foo::doIt );// assertassertThat( actual ).isInstanceOf( IllegalStateException.class ).hasMessage( Foo.ERR_MESSAGE );}
}

为了澄清起见,我添加了一些注释,以描述测试方法中三个阶段的明确分离。 如果没有抛出异常,则assert块将以断言错误来退出此过程,并指出“期望实际值不为null” 3

结论

通过将Throwable存在检查从行为转移到断言阶段,基于Java8 lambda表达式的catch-exception方法允许以一种非常简洁的方式编写此类测试-至少从我当前的角度来看。

所以你怎么看? 我想念什么吗?

  1. 为了使异常测试更简洁,catch-exception库在一行代码中捕获异常,并使它们可用于进一步分析
  2. 请参阅实用单元测试,第3.9章。 单元测试的阶段,Tomek Kaczanowski 2013,通常也表示为构建-操作-检查模式,清洁代码,第9章。单元测试,Robert C. Martin,2009年
  3. Assertion#isNotNull检查由Assertion#isInstanceOf隐式调用,但当然也可以显式调用

翻译自: https://www.javacodegeeks.com/2014/07/clean-junit-throwable-tests-with-java-8-lambdas.html

使用Java 8 Lambda清理JUnit Throwable-Tests相关推荐

  1. 这是一个有趣的问题,Java 8 Lambda 表达式被编译成了什么?

    在了解了Java 8 Lambda的一些基本概念和应用后, 我们会有这样的一个问题: Lambda表达式被编译成了什么? 这是一个有趣的问题,涉及到JDK的具体的实现.本文将介绍OpenJDK对Lam ...

  2. Java 8 Lambda 表达式被编译成了什么?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取个gui 在了解了Java 8 Lambda的一些基本概念和应用后, 我们会 ...

  3. Java高级-Lambda 表达式、异常处理、集合、泛型、List集合、Map集合、Collections类

    目录 Lambda 表达式 Java Lambda 表达式的优缺点 异常处理 Exception 处理及常见异常 try catch语句 try catch finally语句 throws 声明异常 ...

  4. 10个Java 8 Lambda表达式经典示例

    Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表 达式,它将允许我们将行为传到函数里.在J ...

  5. Java 8 Lambda 表达式详解

    版权声明:本文由吴仙杰创作整理,转载请注明出处:https://segmentfault.com/a/1190000009186509 1. 引言 在 Java 8 以前,若我们想要把某些功能传递给某 ...

  6. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

  7. java lambda 应用场景,Java中Lambda的使用范围

    在之前的学习中,我们已经对Lambda表达式有所接触,并进行了相关的操作.那么在具体的使用过程上,我们需要明确其具体的使用范围.本篇将以三种访问类型为例,局部变量.成员变量和静态变量,并为大家讲解不同 ...

  8. Java 8 Lambda表达式-接口实现

    Java 8 Lambda表达式在只有一个方法的接口实现代码编写中,可以起到简化作用: (argument list) -> body 具体看Runnable接口的例子 public class ...

  9. java 8 lambda表达式中的异常处理

    文章目录 简介 处理Unchecked Exception 处理checked Exception 总结 java 8 lambda表达式中的异常处理 简介 java 8中引入了lambda表达式,l ...

最新文章

  1. 简易zlib库解压缩函数封装
  2. IO之阻塞与非阻塞比较
  3. crm系统是什么很棒ec实力_搭建CRM系统要明确几个步骤?什么样的CRM是真正有用的系统?...
  4. 仿射变换和射影变换、等距变换、相似变换
  5. server2012R2VC++2015 redistributable安装出错KB2999226-x64.msu 此更新不适合你的计算机
  6. 泽众AutoRunner软件的使用方法,以测试win10环境下系统自带的计算器为例
  7. python | 降水数据分析(Ⅰ) 绘制全国降水四季分布图
  8. 算法设计与分析 SCAU11083 旅游背包(优先做)
  9. CAT实时监控预警系统
  10. 我不知道 我知道你不知道 现在我知道了 我也知道了
  11. 最佳情侣身高差 (10 分)
  12. 我所理解的高通UEFI之display的流程和移植
  13. 锐捷ac怎么发现局域网ap_【实战】锐捷AC+AP配置WLAN基本服务系列
  14. 高薪就业面试题系列 人事篇三
  15. 如何在 Pandas DataFrame 中插入一行
  16. 转移到ios下载安卓_转移到ios官方app下载|转移到IOS安卓版下载_v2.10.0_9ht安卓下载...
  17. CCS软件的基本使用(以MSP430为)
  18. HTML中拖动消失的球代码,js拖拽360桌面悬浮球代码
  19. JavaWeb笔试题
  20. 开一个高效的IT会议,需要花点心思

热门文章

  1. SparkSQL中UDAF案例分析
  2. hashmap应用场景_工作中常用到的Java集合有哪些?应用场景是什么?
  3. cmw500综合测试仪使用_山西优质三相直流电阻测试仪图片-南电合创
  4. 编译报错+解决方法:错误: 找不到符号
  5. 脚本语言和工程语言_语言工程中有趣的事情
  6. jax-rs jax-ws_信守承诺:针对JAX-RS API的基于合同的测试
  7. 结果集 tostring_关于避免对toString()结果进行解析或基于逻辑的美德
  8. python antlr_使用ANTLR在5分钟内用Java解析任何语言:例如Python
  9. mockito入门_Mockito入门
  10. rest服务swagger_使用Swagger轻松记录您的Play Framework REST API