gpt4 book ai didi

java - 使用assertJ 断言列表元素的属性

转载 作者:行者123 更新时间:2023-12-01 21:32:50 25 4
gpt4 key购买 nike

我有一个有效的 hamcrest 断言:

assertThat(mylist, contains(
containsString("15"),
containsString("217")));

预期的行为是:

  • mylist == asList("Abcd15", "217aB") => 成功
  • myList == asList("Abcd15", "218") => 失败

如何将此表达式迁移到assertJ。当然,存在简单的解决方案,例如断言第一个和第二个值,如下所示:

assertThat(mylist.get(0)).contains("15");
assertThat(mylist.get(1)).contains("217");

但这些是对列表元素的断言,而不是对列表的断言。尝试列表上的断言将我限制为非常通用的函数。所以也许只能通过自定义断言来解决,像下面这样就可以了:

assertThat(mylist).elements()
.next().contains("15")
.next().contains("217")

但是在我编写自定义断言之前,我会对其他人如何解决这个问题感兴趣?

编辑:一项额外的非功能性要求是,测试应该可以通过额外的约束轻松扩展。在 Hamcrest 中,表达附加约束非常容易,例如

assertThat(mylist, contains(
emptyString(), //additional element
allOf(containsString("08"), containsString("15")), //extended constraint
containsString("217"))); // unchanged

在此示例中,依赖于列表索引的测试必须重新编号,使用自定义条件的测试必须重写完整条件(请注意,allOf 中的约束不限于子字符串检查)。

最佳答案

AssertJ v3.19.0 或更高版本:使用 satisfiesExactly

2021 年发布的 AssertJ v3.19.0 添加了 satisfiesExactly 方法。

所以你可以写:

assertThat(mylist)
.satisfiesExactly(item1 -> assertThat(item1).contains("15"),
item2 -> assertThat(item2).contains("217"));

如果需要,您可以向各个元素添加更多断言:

assertThat(mylist)
.satisfiesExactly(item1 -> assertThat(item1)
.contains("08")
.contains("15"),
item2 -> assertThat(item2).contains("217"));

与使用 next() 链的技术相比,此技术还会为您检查列表大小。作为一个额外的好处,它允许您使用您喜欢的任何 lambda 参数,因此更容易阅读和跟踪您所在的元素。

关于java - 使用assertJ 断言列表元素的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48042592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com