使用Java 8 Lambda清理JUnit Throwable-Tests

最近,我参与了一个关于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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

封装 axios 请求

vue 封装 js 方法 一、安装 axios 并引入: Axios 中文说明 安装axios:npm install axios因为基本上全局都会使用到 axios 方法,所以在 main.js 中引入: import axios from axios; Vue.prototype.$axios axios //全局注册&…

Response.Redirect 编码的问题

UTF-8 传递到 gb2312 HttpUtility.UrlEncode("要传递的字符参数",Encoding.GetEncoding("GB2312"))转载于:https://www.cnblogs.com/JensonBin/archive/2010/11/27/1889726.html

P1553 数字反转(升级版)

P1553 数字反转(升级版) 温馨提示 1.在处理小数的时候注意处理末尾的0,反转后末尾不得有多余的0 (判断的时候 s[ i ] ! 0 判断的是字符) 2.处理小数和分数的时候,要符号前后分别输出, flag标…

http协议以及防盗链技术

http协议,又称为超文本传输协议,顾名思义,http协议不仅能传输文本,还能传输图片,视频,压缩包等文件,http协议是建立在tcp/ip协议的基础之上的,http协议对php程序员来讲可以说是重中之…

移动端 flexible.js 布局详解

原本想直接引入原文链接,但是又担心作者哪天想不开注销账号,这么好的一篇文章看不到了,还是转载一下吧(/ω\)。 另外推荐一篇好文:移动端rem自适应实操讲解 本文讲的通过 flexible.js 实现了rem自适应,有了…

Gradle善良:获得更多的依赖性见解

在我们的大多数项目中,我们都依赖于其他代码,例如库或其他项目。 Gradle有一个不错的DSL来定义依赖关系。 依赖性在依赖性配置中分组。 这些配置可以自己创建,也可以通过插件添加。 一旦定义了依赖项,我们就可以通过dependencies任…

DotnetCharting控件的破解方法

在.net使用DotNetCharting控件生成报表统计图总结 文章中,不少博友提出“1.生成的图片带超链接导向官网,如何处理呀?2.我使用这个控件后,图形可以显示出来。但是发现一个小问题。就是在图形的左上方和图形的下面都隐含了超链接,鼠…

Android开发利器之ActivityTracker

版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/113 Android开发利器之ActivityTracker 今天在群里面划水,有个小伙伴问到一个问题,”刚进公司 清单文件的activity 较…

js css模仿打字效果

1.效果 2.源码 <% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head><style type"text/css">#myDiv{display: inline-block;width:500px;height:300px;background-color:rgba(0,0,0,0.3);colo…

iframe 高度根据子页面来确定

标题描述一、解决方法解决代码二、关于高度问题简单讲一下jquery中的 height()&#xff0c;innerHeight()、outHeight()&#xff0c;js中的offsetHeight、clientHeight、scrollHeight。如何获取没有给出高度的元素的高度&#xff1f;详细介绍offsetHeight,clientHeight,scrollH…

避免许多if块进行验证检查

在某些情况下&#xff0c;我们需要先验证输入数据&#xff0c;然后再将其发送到业务逻辑层进行处理&#xff0c;计算等。这种验证在大多数情况下是孤立完成的&#xff0c;或者可能包括与外部数据或其他输入的某些交叉检查。 看下面的示例&#xff0c;该示例验证用户输入的注册数…

谷歌逐步取消对IE6的支持

1月30日&#xff0c;据国外媒体报道&#xff0c;谷歌周五宣布&#xff0c;截至3月1日&#xff0c;谷歌将不再其谷歌Docs和谷歌网站服务支持IE6。如果IE用户想使用那些产品&#xff0c;他们必须至少升级到版本7&#xff0c;如同“其他许多公司已经停止支持如Internet Explorer 6…

国内手机号正则表达式

java的写法&#xff1a; String pattern "^((1[358][0-9])|(14[57])|(17[0678])|(19[7]))\\d{8}$"; javascript的写法&#xff1a; var pattern /^((1[358][0-9])|(14[57])|(17[0678])|(19[7]))\d{8}$/; 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.co…

layui 子页面写弹出框覆盖父页面,以及给弹框中的表单赋值

咋说呢&#xff0c;因为对 layui 不太熟悉&#xff0c;这个弹出框搞了好久&#xff0c;看了好多解决方案&#xff0c;大致尝试了一下其中几种&#xff0c;在坑中无法自拔。。。总之终于搞出来了&#xff0c;在这里分享一下我的笔记。 着急的直接 戳这里 看解决代码。 尝试 1、…

html实现文字垂直居中且设置间隔

使用table和table-call布局 将表格作为一个table表&#xff0c;使用table-cell定义每个单元格的布局为table-cell, 抛出display的有效值 单元格中间的间隔使用 border-spacing:10px; border-collapse: separate;定义单元格vertical-align: middle; display: table-cell;代码源码…

入世与出世

同情恰好有两种。一种同情怯懦感伤&#xff0c;实际上只是心灵的焦灼。看到别人的不幸&#xff0c;急于尽快脱身出来&#xff0c;以免受到感动&#xff0c;陷入难堪的境地。这种同情根本不是对别人的痛苦抱有同感&#xff0c;而只是本能地予以抗拒&#xff0c;免得它触及自己的…

Hibernate隐藏的宝石:pooled-lo优化器

介绍 在这篇文章中&#xff0c;我们将揭示一个序列标识符生成器&#xff0c;​​它结合了标识符分配效率和与其他外部系统的互操作性&#xff08;同时访问底层数据库系统&#xff09;。 传统上&#xff0c;有两种序列标识符策略可供选择。 序列标识符&#xff0c;对于每个新值…

vue inheritAttrs、$attrs和$listeners使用

inheritAttrs、$attrs和$listeners使用场景&#xff1a; 组件传值&#xff0c;尤其是祖孙组件有跨度的传值。 &#xff08;1&#xff09;inheritAttrs 属性说明&#xff1a;https://cn.vuejs.org/v2/api/#inheritAttrs 说明比较晦涩。 组件传值一般是通过props传值的。inhe…

鼠标滚轮事件及解决滚轮事件多次触发问题

转载&#xff1a;https://www.cnblogs.com/jjxhp/p/11736066.html#_label0 一、滚轮事件的 js 写法 二、jQuery写法 三、参考 四、滚轮事件滚动过快&#xff0c;事件触发两次 一、js //判断鼠标滚轮滚动方向 if (window.addEventListener){ //FF,火狐浏览器会识别该方法wind…

Leetcode 2976. Minimum Cost to Convert String I

Leetcode 2976. Minimum Cost to Convert String I 1. 解题思路2. 代码实现 题目链接&#xff1a;2976. Minimum Cost to Convert String I 1. 解题思路 这道题思路上其实是非常直接的&#xff0c;本质上就是给出有向图之后&#xff0c;求出有向图上任意两点之间的最短距离&…