AssertJ的SoftAssertions –我们需要它们吗?

编写好的单元测试的规则之一是,它应该出于某种原因而失败,因此,单元测试应该测试一种逻辑概念。 有时很难在每个测试中拥有一个断言。 为了遵循规则,我们可能在一个测试中每个对象具有多个断言。

但是,在单个测试中存在多个断言的问题在于,如果第一个断言由于任何原因而失败,我们实际上将不知道其他断言,因为它们将不会被执行。 并且您知道了演练:您检查断言失败原因,进行修复,然后重新运行测试。 也许您很幸运,测试会通过。 但是也许它将因另一个断言而失败。 对于真正快速的单元测试,这不是什么大问题,但是例如,在进行硒测试时,分析和故障检测可能会变得很麻烦并且肯定会很费时。

幸运的是,借助AssertJ的SoftAssertions ,我们可以重新考虑在测试中创建断言的SoftAssertions

一个宣称可以统治所有人的主张!

在假设的Dice游戏中,有一个Score对象,其中保存得分值,骰子组合和提醒。 在单元测试中,我们可能想验证不同骰子组合的分数计算方式。

在下面的示例中,验证了一个概念(得分对象):

@Test
public void verifiesScore() {Score score = Score.scoreBuilder().withValue(11).withCombination(dice(1, 1, 3, 4)).withReminder(dice(6)).build();assertThat(score.getValue()).as("Has score").isEqualTo(8);assertThat(score.getCombination()).as("Has combination").isEqualTo(dice(1, 1, 3, 3));assertThat(score.getReminder()).as("Has reminder").isEqualTo(dice(5));
}

如您所见,所有三个断言都失败了,但是由于第一个失败后测试的执行停止,因此我们只会看到第一个失败的结果:

org.junit.ComparisonFailure: [Has score] 
Expected :8
Actual   :11

引入

为了解决这个问题,我们可以使用SoftAssertions ,它将在调用assertAll()方法时立即收集所有断言的结果:

@Test
public void verifiesScoreSoftly() {Score score = Score.scoreBuilder().withValue(11).withCombination(dice(1, 1, 3, 4)).withReminder(dice(6)).build();SoftAssertions softAssertions = new SoftAssertions();softAssertions.assertThat(score.getValue()).as("Has score").isEqualTo(8);softAssertions.assertThat(score.getCombination()).as("Has combination").isEqualTo(dice(1, 1, 3, 3));softAssertions.assertThat(score.getReminder()).as("Has reminder").isEqualTo(dice(5));softAssertions.assertAll();
}

现在我们可以验证测试中的所有断言失败:

org.assertj.core.api.SoftAssertionError: 
The following 3 assertions failed:
1) [Has score] expected:<[8]> but was:<[11]>
2) [Has combination] expected:<...alue=3}, Dice{value=[3]}]> but was:<...alue=3}, Dice{value=[4]}]>
3) [Has reminder] expected:<[Dice{value=[5]}]> but was:<[Dice{value=[6]}]>

JUnitSoftAssertions

代替手动创建SoftAssertions并调用其assertAll()我们可以使用JUnit @Rule

@Rule
public JUnitSoftAssertions softAssertions = new JUnitSoftAssertions();@Test
public void verifiesScoreSoftlyUsingRule() {Score score = Score.scoreBuilder().withValue(11).withCombination(dice(1, 1, 3, 4)).withReminder(dice(6)).build();softAssertions.assertThat(score.getValue()).as("Has score").isEqualTo(8);softAssertions.assertThat(score.getCombination()).as("Has combination").isEqualTo(dice(1, 1, 3, 3));softAssertions.assertThat(score.getReminder()).as("Has reminder").isEqualTo(dice(5));
}

我们不仅不需要记住调用assertAll()而且还可以在IntelliJ的比较编辑器中看到潜在的失败:

0B0b09VuqaAG8WGxhUUhxdmZfa3M

自定义

为了提高分数验证的可读性和可重用性,我们可以创建一个自定义断言,以便可以按以下方式使用它:

@Test
public void verifiesScoreSoftlyWithCustomAssertion() {Score score = Score.scoreBuilder().withValue(11).withCombination(dice(1, 1, 3, 4)).withReminder(dice(6)).build();SoftScoreAssertion.assertThat(score).hasValue(8).hasCombination(dice(1, 1, 3, 3)).hasReminder(dice(5)).assertAll();
}

SoftScoreAssertion使用SoftAssertions ,因此我们仍然会立即看到所有断言错误。 和代码:

class SoftScoreAssertion extends AbstractAssert<SoftScoreAssertion, Score> {private SoftAssertions softAssertions = new SoftAssertions();protected SoftScoreAssertion(Score actual) {super(actual, SoftScoreAssertion.class);}public static SoftScoreAssertion assertThat(Score actual) {return new SoftScoreAssertion(actual);}public SoftScoreAssertion hasValue(int scoreValue) {isNotNull();softAssertions.assertThat(actual.getValue()).as("Has score").isEqualTo(scoreValue);return this;}public SoftScoreAssertion hasReminder(List<Dice> expected) {isNotNull();softAssertions.assertThat(actual.getReminder()).as("Has reminder").isEqualTo(expected);return this;}public SoftScoreAssertion hasCombination(List<Dice> expected) {isNotNull();softAssertions.assertThat(actual.getCombination()).as("Has combination").isEqualTo(expected);return this;}@Overridepublic SoftScoreAssertion isNotNull() {softAssertions.assertThat(actual).isNotNull();return this;}public void assertAll() {this.softAssertions.assertAll();}
}

资源资源

  • http://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#soft-assertions
  • https://github.com/joel-costigliola/assertj-core/wiki/Creating-specific-assertions

源代码

  • 可以在GitHub上的我的unit-testing-demo项目中找到本文的源代码: https : //github.com/kolorobot/unit-testing-demo 。

翻译自: https://www.javacodegeeks.com/2015/09/assertjs-softassertions-do-we-need-them.html

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

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

相关文章

早上起来CSDN的PC端主页积分变成了0

没有违法&#xff0c;没有乱纪&#xff0c;这是什么鬼&#xff1f;我刚才百度了一下&#xff0c;很多大牛都有类似的经历&#xff0c;心里舒服多了 平台BUG还是挺多的&#xff0c;说不准哪天就轮到你啦&#xff0c;哈哈&#xff01;&#xff01;

Fofa搜索技巧

Fofa搜索技巧&#xff08;理论加实践的整理&#xff09; 题记 最近在整理以前的知识&#xff0c;不过最近出现职业病了&#xff0c;打开fofa看站点就停不下来。我把常用的fofa查询语句记录下来&#xff0c;方便查阅。钟馗之眼和他有区别也异曲同工。 https://fofa.so/ http://…

魔兽世界阿拉索人数最多服务器,魔兽世界8.3哪个区人多_wow8.3服务器人数统计介绍_3DM网游...

魔兽世界8.3人口最多大区是很多玩家都非常关心的一件事情&#xff0c;很多玩家都想在这个新版本去最多的服务器&#xff0c;很多玩家都想知道服务器人口&#xff0c;来看看魔兽世界8.3哪个区人多&#xff0c;wow8.3服务器人数统计介绍。8.3人口最多大区介绍魔兽世界8.3安苏大区…

如何系统的学习javaScript?赶紧看看吧

当今如果要开发现代网站或web应用(包括互联网创业),都要学会JavaScript。而面对泛滥的JavaScript在线学习资源,却是很难找到一份高效而实用的方法去学习这个“web时代的语言”。有一点需要注意,几年前我们需要知道一个真正的服务器端语言(比如PHP,Rails,Java,Python 或…

Shiro-550反序列化漏洞复现

0x01 漏洞简介Apache Shiro是一款开源安全框架&#xff0c;提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用&#xff0c;同时也能提供健壮的安全性。 Apache Shiro 1.2.4及以前版本中&#xff0c;加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可…

css 样式面板,关于 CSS 样式面板

使用“CSS 样式”面板可以跟踪影响当前所选页面元素的 CSS 规则和属性(“当前”模式)&#xff0c;也可以跟踪文档可用的所有规则和属性(“所有”模式)。使用面板顶部的切换按钮可以在两种模式之间切换。使用“CSS 样式”面板还可以在“所有”和“当前”模式下修改 CSS 属性。有…

Fragment 横竖屏切换问题

在默认情况下当发生横竖屏切换时&#xff0c;当前Activity中的fragment都会通过Fragment.instantiate重新生成&#xff0c;该方法将使用默认的构造函数来生成相应的Fragment&#xff0c;所以如果没有默认构造函数的话将会报错&#xff0c;例如&#xff1a;class MyFragment { p…

IIS-ShortName-Scanner使用

000 漏洞简介 Microsoft IIS在实现上存在文件枚举漏洞&#xff0c;攻击者可利用此漏洞枚举网络服务器根目录中的文件。 危害&#xff1a;攻击者可以利用“~”字符猜解或遍历服务器中的文件名&#xff0c;或对IIS服务器中的.Net Framework进行拒绝服务攻击。 001 工具简介 J…

配置java ee_Java EE中的配置管理

配置java ee当我尝试配置管理与云计算有很多相关性时&#xff0c; 争论 较早。 实际上&#xff0c;我大胆地宣称配置管理是任何认真尝试从软件中节省几美元的基石。 那么什么是配置管理及其主要目标&#xff1f; 在不使事情变得过于复杂的情况下&#xff0c;我认为接下来的两个…

我的世界中国版服务器地图文件在哪,我的世界中国版手机版联机的地图保存在哪 | 手游网游页游攻略大全...

发布时间&#xff1a;2017-05-12我的世界战舰设计图 手机版战舰怎么做.那下面给大家分享的是玩家自己在手机版中手撸的一个战舰建筑哦~那感兴趣的玩家不妨进来看看他是怎么建造战舰的哦~希望大家喜欢. 游戏园我的世界官方群:325049520 二群:25607 ...标签&#xff1a;我的世界 …

kali NETCAT NC的使用

文章目录 nc的常用选项NC具有的常用功能telnet / 获取banner信息传输文本信息传输文件/目录加密传文件端口扫描远程克隆硬盘远程控制NCAT TCPDUMP简单用法 nc的常用选项 -l 开启监听模式&#xff0c;用于入站链接 -p 开放本地端口 -n 远程连接&#xff0c;后面要跟上端口 -v …

如何循序渐进的学习javaScript呢,请听我慢慢道来!

大家可以参考知乎上的这篇文章&#xff0c;我觉得还不错&#xff0c;分享给你们 https://www.zhihu.com/question/19713563

记录链接:与杜克一起玩

最近&#xff0c;我在记录链接方面变得非常有趣&#xff0c;并遇到了Duke项目&#xff0c;该项目提供了一些工具来帮助解决此问题。 我以为可以尝试一下。 进行记录链接时的典型问题是&#xff0c;我们有两个来自不同数据集的记录&#xff0c;它们代表同一实体&#xff0c;但是…

win10修改服务器地址,win10 修改服务器地址

win10 修改服务器地址 内容精选换一换通过华为云创建的ECS服务器默认使用华为云提供的内网DNS进行解析。内网DNS不影响ECS服务器对公网域名的访问。同时&#xff0c;还可以不经Internet&#xff0c;直接通过内网DNS访问其他云上服务内部地址&#xff0c;如OBS、SMN等&#xff0…

enmo_day_06

RAC Data Guard (DG) EMC NAS SAN 双活 数据完整性 约束 &#xff1a; 主键 &#xff1a; 非空 且 唯一 非空 &#xff1a; 唯一 &#xff1a; 外键 &#xff1a; 检查 &#xff1a; DISABLE, ENABLE VALIDATE, NOVALIDATE 约束条件检查 执行语句时 &#xff08;对于非延迟约束…

centos8如何安装yum源(详细步骤)

进入目录 cd /etc/yum.repos.d //进入/etc/yum.repos.d目录查看并删除/etc/yum.repos.d目录下所有的配置文件 ll //查看当前目录的所有文件 rm -rf ./* //删除当前的所有文件下载centos8的镜像源 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors…

前端开发常见的浏览器兼容性问题?

参考帖子1&#xff1a;https://www.cnblogs.com/angel648/p/11392262.html 参考帖子2&#xff1a;https://www.cnblogs.com/wxf-h/p/10513342.html

2048游戏详解

由于最近在百度IFE看到有2048任务&#xff0c;所以昨天兴趣一来自己也做了一个。大概花了五个小时完成&#xff0c;不过不足之处是操作时没有滑动效果。昨晚新增了手机版本&#xff0c;流畅度还可以&#xff0c;不过由于没有滑动&#xff0c;游戏过程显得很突兀啊&#xff0c;且…

百度搜索引擎服务器性能,百度搜索引擎的特点

1. 基于字词结合的信息处理方式。巧妙解决了中文信息的理解问题&#xff0c;极大地提高了搜索的准确性和查全率。2. 支持主流的中文编码标准。包括GBK(汉字内码扩展规范)、GB2312(简体)、BIG5(繁体)&#xff0c;并且能够在不同的编码之间转换。3. 智能相关度算法。采用了基于内…

vulhub安装教程

0x00 vulhub介绍 Vulhub是一个基于docker和docker-compose的漏洞环境集合&#xff0c;进入对应目录并执行一条语句即可启动一个全新的漏洞环境&#xff0c;让漏洞复现变得更加简单&#xff0c;让安全研究者更加专注于漏洞原理本身。 大哥你等会&#xff0c;你刚才讲的docker我听…