![](/img/trans.png)
[英]Matching varargs in Mockito for unit testing in an overloaded method
[英]Mockito and matching varargs properly with overloaded methods with Spring Redis
我的服務中有以下方法。
private final ReactiveRedisTemplate<String, String> reactiveRedisTemplate;
public Mono<Boolean> deleteObject(String... keys) {
return reactiveRedisTemplate.delete(keys).map(c -> c > 0);
}
ReactiveRedisTemplate 有兩個用於刪除的內部實現,具有不同的簽名。
@SafeVarargs
public final Mono<Long> delete(K... keys) {
Assert.notNull(keys, "Keys must not be null!");
Assert.notEmpty(keys, "Keys must not be empty!");
Assert.noNullElements(keys, "Keys must not contain null elements!");
if (keys.length == 1) {
...
public Mono<Long> delete(Publisher<K> keys) {
Assert.notNull(keys, "Keys must not be null!");
return this.doCreateFlux((connection) -> {
現在,當我有以下內容時
var key = "key";
when(reactiveRedisTemplate.delete(key)).thenReturn(Mono.just(1L));
StepVerifier.create(service.removeObject(key))
.expectNextMatches(c -> c)
.verifyComplete();
verify(this.reactiveRedisTemplate, times(1)).delete(key);
我收到 NullPointerException 錯誤,因此看起來可變參數不匹配。 使用 ArgumentMatcher,收到以下信息:
when(reactiveRedisTemplate.delete(ArgumentMatchers.<String>any())).thenReturn(Mono.just(1L));
=> java.lang.IllegalArgumentException: Keys must not contain null elements!
when(reactiveRedisTemplate.delete(eq(new String[] { key }))).thenReturn(Mono.just(1L));
=> java.lang.IllegalArgumentException: Keys must not be null!
when(reactiveRedisTemplate.delete(anyString())).thenReturn(Mono.just(1L));
=> java.lang.NullPointerException (doesn't seem to match)
最后一個自定義匹配器:
public class StringVarargsMatcher implements VarargMatcher, ArgumentMatcher<String[]> {
private String[] expectedValues;
public StringVarargsMatcher(String... expectedValues) {
Arrays.sort(expectedValues);
this.expectedValues = expectedValues;
}
@Override
public boolean matches(String[] strings) {
Arrays.sort(strings);
return Arrays.equals(strings, expectedValues);
}
}
when(reactiveRedisTemplate.delete(argThat(new StringVarargsMatcher(key)))).thenReturn(Mono.just(1L));
=> java.lang.IllegalArgumentException: Keys must not be null!
有什么辦法可以克服這個問題,這樣我就可以從 ReactiveRedisTemplate 模擬刪除並在這里完成單元測試嗎?
您不是 mocking public final Mono<Long> delete(K... keys)
因為它是最終方法並且您沒有使用內聯模擬制造商(如評論中所述)。
因此,真正的方法被調用。
ArgumentMatcher 工廠方法,例如any()
將它與被調用的真實方法結合起來——你會在真實方法所做的斷言中出錯。
請參閱: Mocking 最終類型、枚舉和最終方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.