断言列表包含具有任意顺序的特定属性的元素

Chr*_*ris 3 java kotlin junit5 kotest

在 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))
        )
    ));
Run Code Online (Sandbox Code Playgroud)

我还没有找到一种方法来在我尝试过的 kotest 中表达这一点,shouldContainExactlyInAnyOrder但他们期望一个实际的对象。我不知道如何表达我想针对不同的匹配器测试每个元素。

我还检查了检查员,这可能是解决方案,但它们似乎只能帮助立即对列表中的所有元素做出断言。

Kar*_*iel 5

科测试检查员可能就是您正在寻找的。它们允许测试集合中的所有元素、没有元素或特定数量的元素是否满足特定断言。

如果不了解地址引用数据类型,我会假设您的示例可以转换为 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

正如@LeoColman 所指出的,withClueassertSoftly不是强制性的:

  • withClue只是将给定的线索作为附加信息添加到断言错误消息中,以防断言失败。
  • assertSoftly让其中的所有断言运行,而不是在第一个失败的断言处停止。这意味着,如果我们有一个包含 3 个元素的集合,我们仍然可以获得有关存在或不存在带有 和 的元素这一事实的id "abc"信息role SENDER