【问题标题】:How do I negate assertions in AssertJ?如何否定 AssertJ 中的断言?
【发布时间】:2025-11-28 13:25:03
【问题描述】:

使用 Hamcrest 可以很容易地否定匹配器。例如。你可以这样写一个断言:

assertThat("The dog bites Tom", not(stringContainsInOrder(Arrays.asList("Tom", "dog"))));

即使用 org.hamcrest.core.IsNotorg.hamcrest.core.AnyOf 匹配器很容易组合或否定断言。

在 AssertJ 中是否有任何等价物? 我知道可以合并/否定Conditions。但是正常的断言方法呢?例如。如果你想测试一个字符串 not 只包含数字,你会怎么做,即否定以下断言:

assertThat("1234xxx5678").containsOnlyDigits();

【问题讨论】:

  • 刚刚在 AssertJ github 页面上提交了一个功能请求...

标签: assertj


【解决方案1】:

无法组合普通的断言方法,这是 Hamcrest 比 AssertJ 更灵活的领域。

在您的情况下,我会按照您的建议编写一个 Condition 或使用带有 matches 断言的 lambda。

【讨论】:

    【解决方案2】:

    这样就可以了:

    assertThat(Collections.singleton("1234xxx5678")).noneSatisfy(candidate -> 
        assertThat(candidate).containsOnlyDigits()
    );
    

    有点老套,意图的清晰性并没有完全达到正常的 assertJ 标准,但对于否定任何断言的完全一般情况,这是我们目前所拥有的。

    当与链式断言结合使用时,流利的 not() 会令人困惑,但我希望我们可以在 AbstractObjectAssert 上有一个通用的 doesNotSatisfy(Consumer)

    【讨论】: