如何在AssertJ中否定断言?

Joe*_*ern 5 assertj

使用Hamcrest,可以很容易地取消匹配器。例如,您可以编写这样的断言:

assertThat("The dog bites Tom", not(stringContainsInOrder(Arrays.asList("Tom", "dog"))));
Run Code Online (Sandbox Code Playgroud)

也就是说,使用org.hamcrest.core.IsNotorg.hamcrest.core.AnyOf匹配器很容易合并或取反断言。

AssertJ中有等效的东西吗?我知道可以合并/取反Condition。但是普通的断言方法呢?例如,如果您想测试字符串不是仅由数字组成,该怎么做,即取反以下断言:

assertThat("1234xxx5678").containsOnlyDigits();
Run Code Online (Sandbox Code Playgroud)

Joe*_*ola 5

无法组合常规断言方法,这是Hamcrest比AssertJ更灵活的地方。

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


Joa*_*ous 5

这就能解决问题:

assertThat(Collections.singleton("1234xxx5678")).noneSatisfy(candidate -> 
    assertThat(candidate).containsOnlyDigits()
);
Run Code Online (Sandbox Code Playgroud)

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

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