[英]JUnit ~ Assert that list contains objects with the same values in any order
[英]Assert that list contains elements with specific properties in any order
在 Junit5 中,我经常使用以下代码片段来测试集合是否包含满足某些条件的元素:
assertThat("The list of addresses", addresses.getAddressReferences(), containsInAnyOrder(
allOf(
hasProperty("id", is("abc")),
hasProperty("role", is(SENDER))
),
allOf(
hasProperty("id", is("def")),
hasProperty("role", is(RECEIVER))
)
));
我还没有找到在 kotest 中表达这一点的方法,我尝试shouldContainExactlyInAnyOrder
等,但他们期望实际的 object。 我不知道如何表达我想针对不同的匹配器测试每个元素。
我还检查了可能是解决方案的检查员,但他们似乎只有助于一次对列表中的所有元素做出断言。
Kotest Inspectors可能是您正在寻找的。 它们允许测试集合中的所有、无或特定数量的元素是否满足特定断言。
在不了解地址引用数据类型的情况下,我会假设您的示例可以像这样转换为 Kotest:
withClue("The list of addresses") {
val references = addresses.getAddressReferences()
assertSoftly {
references shouldHaveSize 2
references.forOne {
it.id shouldBe "abc"
it.role shouldBe SENDER
}
references.forOne {
it.id shouldBe "def"
it.role shouldBe RECEIVER
}
}
}
正如@LeoColman 所指出的, withClue
和assertSoftly
不是强制性的:
withClue
只是将给定的线索作为附加信息添加到断言错误消息中,以防断言失败。assertSoftly
内部的所有断言都运行,而不是在第一个失败的断言处停止。 这意味着,例如,如果我们有 3 个元素的集合,我们仍然可以获得关于存在或不存在id
为"abc"
和role
SENDER
的元素的信息。按照@Karsten 的建议使用检查员似乎就是这里的方式!
如果你想保持代码更小,我提出了一种更简单的方法来做出相同的断言:
val references = addresses.getAddressReferences()
references.forOne {
it.id shouldBe "abc"
it.role shouldBe SENDER
}
references.forOne {
it.id shouldBe "def"
it.role shouldBe RECEIVER
}
withClue
和assertSoftly
都是可选的
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.