我有一個來自 Project Reactor 的 Flux 測驗用例,大致如下:
testMultipleChunks(StepVerifier.FirstStep<Chunk> verifier, Chunk chunk1, Chunk chunk2) {
verifier.then(() -> {
worker.add(chunk1);
worker.add(chunk2);
worker.update();
})
.expectNext(chunk1, chunk2)
.verifyTimeout(Duration.ofSeconds(5));
}
問題是,我的作業人員被鼓勵并行化作業,這意味著輸出的順序是未定義的。chunk2, chunk1將同樣有效。
如何以與順序無關的方式對輸出進行斷言?
我關心的屬性:
- 預期集合中的每個元素都存在
- 沒有意外的元素
- 沒有額外的(重復的)事件
我試過這個:
testMultipleChunks(StepVerifier.FirstStep<Chunk> verifier, Chunk chunk1, Chunk chunk2) {
Set<Chunk> expectedOutput = Set.of(chunk1, chunk2);
verifier.then(() -> {
worker.add(chunk1);
worker.add(chunk2);
worker.update();
})
.recordWith(HashSet::new)
.expectNextCount(expectedOutput.size())
.expectRecordedMatches(expectedOutput::equals)
.verifyTimeout(Duration.ofSeconds(5));
}
雖然我認為這是我想要的斷言,但它的可讀性卻大幅下降。一個清晰的一行,一個方法的斷言被替換為四行,并帶有很多額外的標點符號。
expectedRecordedMatches當它失敗時也非常缺乏資訊,只說“預期的集合謂詞匹配”,而沒有提供任何關于預期是什么或結果有多接近的資訊。
撰寫此測驗的更清晰的方法是什么?
uj5u.com熱心網友回復:
StepVerifier不適合這種情況,因為它會在每個信號發出時對其進行驗證,并通過設計實作異步信號的預期順序。
這特別棘手,因為(似乎)您的受測出版商并未明確完成。
如果它在 N 個元素之后完成(N 是此處的預期數量),我會將傳遞給的發布者更改為StepVerifier.createfrom fluxto flux.collectList()。這樣,您可以List查看onNext并且可以根據需要斷言串列(例如,使用我推薦的 AssertJ)。
最近版本的 Reactor 中的一種替代方法是TestSubscriber,它可以用于驅動request,并且cancel()對阻塞或何時執行斷言沒有任何特別的意見。相反,它在內部存盤它看到的事件(onNext進入 a List,onComplete并onError存盤為終端Signal...),您可以訪問這些事件以進行任意斷言。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/470380.html
