groovy StepVerifier::expectError接受Spock中的任何异常

nbnkbykc  于 2022-11-01  发布在  其他
关注(0)|答案(1)|浏览(155)

我正在测试一个使用 Boot 的webflux库的类,我遇到了StepVerifier::expectError的奇怪行为。(甚至String!)添加到方法中,测试通过。对于这个特定的测试,我的被测方法应该响应一个错误Mono,并且mono应该包含一个自定义的异常。我从this SO question中了解到,我在正确的块中运行StepVerifier。这里出了什么问题?
受试类别:

@Service
@RequiredArgsConstructor
public class PaymentsBO {
    private final ContractClient contractClient;

    public Mono<Void> updatePaymentInfo(Request record) {
        return contractClient
                .getContract(UUID.fromString(record.getContractUuid()))
                .onErrorResume(throwable -> Mono.error(() -> new CustomException(
                        "Contract Service responded with a non-200 due to "
                                + throwable.getCause())))
                .flatMap(
                    // happy-path logic
                );
    }
}

单元测试:

def "Returns an error if the Contract Service returns a non-200"() {
    given:
    def testSubject = new PaymentsBO(contractServiceMock)
    def contractServiceMock = Mock(ContractClient)

    when:
    def result = testSubject.updatePaymentInfo(record)

    and:
    StepVerifier.create(result)
        .expectError(String.class)

    then:
    1 * contractServiceMock.getContract(CONTRACT_UUID) >> Mono.error(new ContractServiceException())
}
icnyk63a

icnyk63a1#

StepVerifier文档中,我们可以看到验证必须通过调用verify方法之一来触发
使用verify()或verify(Duration)在结果StepVerifier的出版者上触发结果StepVerifier的验证。(请注意,上述的某些终端预期会以“verify”为前置字符,以宣告预期并触发验证)。https://projectreactor.io/docs/test/release/api/reactor/test/StepVerifier.html
您的代码没有使用verify方法。
请考虑以下两种情况:

@Test
    void without_verify() {
        Mono.error(new IllegalArgumentException(""))
                .as(StepVerifier::create)
                .expectError(NullPointerException.class);
    }
    @Test
    void with_verify() {
        Mono.error(new IllegalArgumentException(""))
                .as(StepVerifier::create)
                .expectError(NullPointerException.class)
                .verify();
    }

without_verify通过,因为没有触发任何验证。
with_verify失败,因为已触发验证。

相关问题