首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Mockito中对varargs进行存根以只匹配一个参数

如何在Mockito中对varargs进行存根以只匹配一个参数
EN

Stack Overflow用户
提问于 2019-03-18 12:45:51
回答 2查看 664关注 0票数 3

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

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

代码语言:javascript
运行
复制
class Foo {
    fun bar(vararg strings : String) : Boolean {
        // Iterates `strings` and returns true when one satisfies some criteria
    }
}

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

代码语言:javascript
运行
复制
val foo = Foo()
whenever(foo.bar(eq("AAA"))).thenReturn(true)

当调用是完全是 foo.bar("AAA")时,这种方法工作得很好。

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

如何修改我的存根代码,以便在调用中传递任意数量的varargs时,它才能工作?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-18 13:03:10

你必须对你的方法进行2次存根。首先,最不具体的存根:

代码语言:javascript
运行
复制
val foo = Foo()
whenever(foo.bar(any())).thenReturn(false) // or whatever you want to return/throw here

然后是更具体的单参数方法:

代码语言:javascript
运行
复制
whenever(foo.bar(eq("AAA"))).thenReturn(true)

在您的评论之后,您可以使用类似的东西(这次使用Java ):

代码语言:javascript
运行
复制
when(foo.bar(any())).thenAnswer(invocation -> {
    for (Object argument : invocation.getArguments()) {
        if ("AAA".equals(argument)) return true;
    }
    return false;
});

在科特林也一样

代码语言:javascript
运行
复制
whenever(foo.bar(any()).thenAnswer {
    it.arguments.contains("AAA")
}
票数 4
EN

Stack Overflow用户

发布于 2019-03-18 13:24:20

您可以创建自己的matcher

代码语言:javascript
运行
复制
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代码):

代码语言:javascript
运行
复制
Foo foo = Mockito.mock(Foo.class);
Mockito.doReturn(true).when(foo).bar(Mockito.argThat(new MyVarargMatcher("AAA")));

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55221731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档