Mockito:在带有超时的模拟Mono上使用when方法会导致InvalidUseOfMatchersExceptio



我正在进行响应式WebClient使用的单元测试,当我试图用方法timeout(Duration d(模拟Mono的行为时,我的问题就来了。

我只想控制通话的结果,比如:

private Mono<String> withTimeout(Mono<String> myMono) {
return myMono.timeout(Duration.of(globalDuration));
}

所以我使用这个:

@Test
void test() {
...
Mono<String> monoMock = (Mono<String>) Mockito.mock(Mono.class);
when(monoMock.timeout(Mockito.any(Duration.class))).thenReturn(Mono.just("OK"));
...
}

但它会产生

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Misplaces or misused argument matcher detected here:
-> at service.UserServiceTest.test(UserServiceTest.java:98)
You cannot use argument matchers outside of verification or stubbing.
Examples of correct usage of argument matchers:
when(mock.get(anyInt())).thenReturn(null);
doThrow(new RuntimeException()).when(mock).someVoidMethod(anyObject());
verify(mock).someMethod(contains("foo"))
This message may appear after an NullPointerException if the last matcher is retur....

当这个Mono.timeout方法的结果时,我应该如何实际

我也刚刚经历了这个奇怪的错误,除了你的错误,我还得到了java.lang.NullPointerException

我能够通过导入来解决这个问题:

<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>4.8.1</version>
</dependency>

在这之后,我能够简单地做到这一点而没有任何问题:

var monoMock = Mockito.mock(Mono.class);
lenient().when(monoMock.timeout((any(Duration.class)))).thenReturn(monoMock);

最新更新