Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Mockito中存根varargs以仅匹配一个参数_Java_Kotlin_Mockito - Fatal编程技术网

Java 如何在Mockito中存根varargs以仅匹配一个参数

Java 如何在Mockito中存根varargs以仅匹配一个参数,java,kotlin,mockito,Java,Kotlin,Mockito,我想存根一些代码,以便当其中一个参数与特定值匹配时,vararg方法返回true。例如,考虑到我无法更改的现有代码: (这里使用Kotlin,但我认为这适用于任何Java情况。) 。。。我想编写类似以下内容的存根代码: val foo = Foo() whenever(foo.bar(eq("AAA"))).thenReturn(true) 当调用正好是foo.bar(“AAA”)时,这可以正常工作 但是,有时被测代码会调用foo.bar(“AAA”、“BBB”),在这些情况下,它会失败 如何

我想存根一些代码,以便当其中一个参数与特定值匹配时,vararg方法返回true。例如,考虑到我无法更改的现有代码:

(这里使用Kotlin,但我认为这适用于任何Java情况。)

。。。我想编写类似以下内容的存根代码:

val foo = Foo()
whenever(foo.bar(eq("AAA"))).thenReturn(true)
当调用正好是foo.bar(“AAA”)时,这可以正常工作

但是,有时被测代码会调用
foo.bar(“AAA”、“BBB”)
,在这些情况下,它会失败

如何修改存根代码,使其在调用中传递任意数量的vararg时工作


编辑标记为可能;在这种情况下,该场景设想在调用中完全省略varargs。在这里,我试图匹配varargs数组的一个特定元素。

您必须将方法存根两次。首先是最不特定的存根:

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):


科特林也是如此

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

您可以创建自己的
匹配器

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;
    }
}

根据op的评论编辑:只要“AAA”是参数之一,它就应该返回true

谢谢!然而,这对我的情况不起作用。只要“AAA”是参数之一,它就应该返回true。它不一定是调用中唯一的参数。@休,看看我的编辑,你可以一直迭代这些参数,然后检查
“AAA”
是否是其中之一谢谢@Lino!工作完美。我有一个编辑等待同行评审,该评审添加了您的解决方案的Kotlin版本。@Hugh我批准了您的编辑,但删除了您的“谢谢”评论,因为您不应该将其放在答案中。但很高兴我能帮助你:)
whenever(foo.bar(any()).thenAnswer {
    it.arguments.contains("AAA")
}
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;
    }
}
Foo foo = Mockito.mock(Foo.class);
Mockito.doReturn(true).when(foo).bar(Mockito.argThat(new MyVarargMatcher("AAA")));