簡體   English   中英

如何在Mockito中存儲varargs只匹配一個參數

[英]How to stub varargs in Mockito to match only one argument

我想存儲一些代碼,以便當其中一個參數與特定值匹配時,vararg方法返回true。 例如,鑒於我無法更改的現有代碼:

(在這里使用Kotlin,但我認為這適用於任何Java情況。)

class Foo {
    fun bar(vararg strings : String) : Boolean {
        // Iterates `strings` and returns true when one satisfies some criteria
    }
}

...我想編寫與此類似的存根代碼:

val foo = Foo()
whenever(foo.bar(eq("AAA"))).thenReturn(true)

當調用正好是 foo.bar("AAA")時,這可以正常工作。

但是,有時候測試中的代碼會調用foo.bar("AAA", "BBB") ,在這種情況下,它會失敗。

如何修改我的存根代碼,以便在調用中傳遞任意數量的varargs時它可以工作?

編輯標記為可能的副本 ; 在這種情況下,該場景考慮完全省略了呼叫中的varargs。 在這里,我試圖匹配varargs數組的一個特定元素。

你必須將你的方法存根2次。 首先是最不具體的存根:

val foo = Foo()
whenever(foo.bar(any())).thenReturn(false) // or whatever you want to return/throw here

然后是更具體的單一參數方法:

whenever(foo.bar(eq("AAA"))).thenReturn(true)

你的評論之后你也可以使用這樣的東西(這次使用Java):

when(foo.bar(any())).thenAnswer(invocation -> {
    for (Object argument : invocation.getArguments()) {
        if ("AAA".equals(argument)) return true;
    }
    return false;
});

在科特林也一樣

whenever(foo.bar(any()).thenAnswer {
    it.arguments.contains("AAA")
}

您可以創建自己的matcher

public class MyVarargMatcher extends ArgumentMatcher<String[]> implements VarargMatcher
{
    private String expectedFirstValue;

    public MyVarargMatcher(String expectedFirstValue)
    {
        this.expectedFirstValue = expectedFirstValue;
    }

    @Override
    public boolean matches(Object varargArgument) {
        if (varargArgument instanceof String[])
        {
            String[] args = (String[]) varargArgument;
            return Stream.of(args).anyMatch(expectedFirstValue::equals);
        }
        return false;
    }
}

然后像那樣使用它(Java代碼):

Foo foo = Mockito.mock(Foo.class);
Mockito.doReturn(true).when(foo).bar(Mockito.argThat(new MyVarargMatcher("AAA")));

用op的評論編輯: 只要“AAA”是其中一個args,它就應該返回true

暫無
暫無

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

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