我现在遇到了一个非常奇怪和令人沮丧的问题。我有一些正在测试的代码,它运行在包含一系列过滤操作的反应式调用链中。
当测试在代码中运行并返回"false"值时,代码仍然会传递到链中的下一个调用,而不仅仅是返回。
由于我还是一个"反应式新手",我想我可能没有在反应式代码链中做错误的事情。
这是代码:
private Mono<GetCardNumberServiceResponseData> updateCardNumberIfLastFourValidAndShaIsNull(Card card, GetCardNumberServiceResponseData responseData) {
return Mono.just(responseData)
.filter(response -> isValidLastFour(card, response))
.defaultIfEmpty(responseData)
.filter(response -> shaIsNull(card))
.defaultIfEmpty(responseData)
.flatMap(response -> updateCardNumber(card, response));
}
这是没有正确评估的部分:
.filter(response -> isValidLastFour(card, response))
这就是"isValidLastFour"当前的样子:
private boolean isValidLastFour(Card card, GetCardNumberServiceResponseData responseData) {
// String cardNumberFromResponse = responseData.getCardNumber();
// String lastFourFromResponse =
// cardNumberFromResponse.substring(cardNumberFromResponse.length() - 4);
// return card.getLastFour().equals(lastFourFromResponse);
return false;
}
因此,目前我只是将其硬编码为返回"false",但当我使用调试器进行测试时,执行就好像返回了"true"一样,所以我真的不知道是什么导致了这种行为。
一如既往,我们非常感谢您的任何帮助!
如果您希望responseData
是默认值,在有空Mono的情况下,您必须将defaultIfEmpty
放在链的末尾:
return Mono.just(responseData)
.filter(response -> isValidLastFour(card, response))
.filter(response -> shaIsNull(card))
.flatMap(response -> updateCardNumber(card, response))
.defaultIfEmpty(responseData);
更好的是,你可以合并这些过滤器:
return Mono.just(responseData)
.filter(response -> isValidLastFour(card, response) && shaIsNull(card))
.flatMap(response -> updateCardNumber(card, response))
.defaultIfEmpty(responseData);