gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:27:18 27 4
gpt4 key购买 nike

我正在为我们的一种响应式(Reactive)方法编写单元测试。此方法依赖于另一个服务。我 mock 了这项服务。运行测试时,我收到以下错误:java.lang.AssertionError:期望“expectError(Class)”失败(预期:onError(MyException);实际: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();
}

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

最佳答案

我认为您遇到的问题是由 SomeUtil.user() 未发出值引起的。

为什么我认为是这样:我尝试了一个简单的示例来重现您的问题:

    @Test
void test() {
Mono<String> monoWithContent =
Mono.just("Content")
.map(element -> exceptionThrower());

// TEST 1
StepVerifier.create(monoWithContent)
.expectError()
.verify();

Mono<String> monoWithoutContent =
Mono.empty()
.map(element -> exceptionThrower());

// TEST 2
StepVerifier.create(monoWithoutContent)
.expectError()
.verify();
}

String exceptionThrower() {
throw new RuntimeException();
}

结果是:

TEST 1 - 成功通过,因为该值是从 Mono 发出的,并且它映射到异常(由ExceptionThrower()

TEST 2 - 失败,因为 Mono 没有发出任何值,因此不会调用 map 方法并且整个执行完成,没有错误。

总而言之,如果 Publisher 没有发出任何内容,则不会调用转换操作。

关于java - Spring Reactive 测试不会导致预期的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58258865/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com