Spring Reactive 测试不会导致预期的错误

我正在为我们的一种反应方法编写单元测试。此方法依赖于另一个服务。我嘲笑了这项服务。运行测试时,我收到以下错误: java.lang.AssertionError: expectation "expectError(Class)" failed (expected: onError(MyException); actual: onComplete())。

这是我尝试过的:

方法(ReactiveService.class):


@Autowired

private Service serice;


public Mono<MyObject> save(List<MyObject> arg1, String arg2) {

    return SomeUtil.user()

            .map(user -> service.save(arg1, arg2, user))

            .subscribeOn(scheduler)

            .doOnError(e -> {

                throw new MyException(MyObject.class, "save object", e);

            });

}

测试:


@Mock

Service service;


@InjectMocks

ReactiveService reactiveService;


@Test

public void unit_test(){

    when(service.save(any(), any(), any())).thenThrow(new RuntimeException());

    Mono<MyObject> result = reactiveService.save(arg1, arg2);

    StepVerifier.create(result)

        .expectError(MyException.class)

        .verify();

}

从错误中我了解到,该方法没有收到任何信号。但我没有得到我在这里错过的东西。


繁星coding
浏览 88回答 1
1回答

BIG阳

我认为您遇到的问题是由于SomeUtil.user()未发出值而引起的。为什么我认为是这样的:我尝试了一个简单的例子来重现您的问题:&nbsp; &nbsp; @Test&nbsp; &nbsp; void test() {&nbsp; &nbsp; &nbsp; &nbsp; Mono<String> monoWithContent =&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Mono.just("Content")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .map(element -> exceptionThrower());&nbsp; &nbsp; &nbsp; &nbsp; // TEST 1&nbsp; &nbsp; &nbsp; &nbsp; StepVerifier.create(monoWithContent)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .expectError()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .verify();&nbsp; &nbsp; &nbsp; &nbsp; Mono<String> monoWithoutContent =&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Mono.empty()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .map(element -> exceptionThrower());&nbsp; &nbsp; &nbsp; &nbsp; // TEST 2&nbsp; &nbsp; &nbsp; &nbsp; StepVerifier.create(monoWithoutContent)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .expectError()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .verify();&nbsp; &nbsp; }&nbsp; &nbsp; String exceptionThrower() {&nbsp; &nbsp; &nbsp; &nbsp; throw new RuntimeException();&nbsp; &nbsp; }结果是:TEST 1 - 成功通过,因为该值是从发出的,Mono并且它被映射到一个异常(RuntimeException由exceptionThrower().TEST 2 - 失败,因为没有要从中发出的值Mono,因此map不会调用该方法,并且整个执行完成且没有错误。总而言之,如果 没有发出任何内容Publisher,则不会调用转换操作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java