我如何否定 AssertJ 中的断言?

How do I negate assertions in AssertJ?

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

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

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

AssertJ 中是否有任何等效项? 我知道 combine/negate Condition 是可能的。但是普通的断言方法呢?例如。如果你想测试一个字符串 not 只包含数字,你会怎么做,即否定以下断言:

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

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

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

这样做就可以了:

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

有点hacky,意图的清晰度不太符合正常的assertJ标准,但对于否定任何断言的完全一般情况,这是我们目前所拥有的。

当与链式断言结合使用时,流利的 not() 会令人困惑,但我确实希望我们可以在 AbstractObjectAssert

上有一个通用的 doesNotSatisfy(Consumer)