簡體   English   中英

Mockito 並將可變參數與重載方法正確匹配 Spring Redis

[英]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()

  • 在 Mockitos 內部注冊一個 metcher state
  • 返回 null

將它與被調用的真實方法結合起來——你會在真實方法所做的斷言中出錯。

請參閱: Mocking 最終類型、枚舉和最終方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM