我正在为我们的反应方法之一编写单元测试。此方法依赖于另一个服务。我嘲笑过这个服务。在运行测试时,我会得到以下错误:java.lang.AssertionError: expectation "expectError(Class)" failed (expected: onError(MyException); actual: onComplete())
。
以下是我尝试过的:
Method(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();
}
从误差中我了解到,没有从该方法接收到信号。但我没有得到我在这里错过的东西。
发布于 2019-10-07 13:13:32
我认为您所遇到的问题是由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()
引发的RuntimeException
)。
TEST 2失败,因为没有从Mono
发出的值,因此没有调用map
方法,整个执行都没有错误。
因此,总之,如果没有从Publisher
发出的内容,那么转换操作就不会被调用。
https://stackoverflow.com/questions/58258865
复制相似问题