2

有没有办法使用 Awaitility 来断言没有任何改变?我想验证一个主题没有被写入,但是因为没有状态变化,Awaitility 不喜欢这样。例如,此代码给出以下错误。谢谢

    @Test
    fun waitUntilListMightBePopulated() {

        val myTopic: List<String> = emptyList()

        await.atLeast(2, TimeUnit.SECONDS).pollDelay(Duration.ONE_SECOND).until {
            myTopic.isEmpty()
        }
    }
ConditionTimeoutException: Condition was evaluated in 1005478005 NANOSECONDS which is earlier than expected minimum timeout 2 SECONDS
4

2 回答 2

0

是的,您可以验证使用during方法
从 Awaitility 4.0.2 版本开始支持它。

例如:
在下面的示例中,我们将在 10 秒内验证,主题将保持为空 [not-changed]。

await()
    .during(Duration.ofSeconds(10)) // during this period, the condition should be maintained true
    .atMost(Duration.ofSeconds(11)) // timeout
    .until (() -> 
        myTopic.isEmpty()           // the maintained condition
    );

提示:
很明显,during超时时间应该小于atMost超时时间[或DefaultTimeout值],否则,测试用例将失败然后抛出一个ConditionTimeoutException

于 2021-12-15T14:54:07.507 回答
0

达到超时时,Awaitility 会抛出 ConditionTimeoutException。检查在预定时间内没有发生任何变化的一种方法是查找更改并断言引发了异常。

请注意,此解决方案非常慢,因为成功结果的等待时间最短,并且带有与抛出异常相关的缺点(Java 中异常对性能的影响是什么?)。

@Test
public void waitUntilListMightBePopulated() {
    List<String> myTopic = new ArrayList<>();

    Assertions.assertThrows(ConditionTimeoutException.class,
        () -> await()
                .atMost(Duration.ofSeconds(2))
                .until(() -> myTopic.size() > 0)
    );
}
于 2021-08-19T06:09:37.613 回答