首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Mockito中正确匹配varargs

如何在Mockito中正确匹配varargs
EN

Stack Overflow用户
提问于 2010-04-14 01:08:50
回答 11查看 71.5K关注 0票数 167

我一直在尝试使用Mockito模拟一个带有vararg参数的方法:

代码语言:javascript
运行
复制
interface A {
  B b(int x, int y, C... c);
}

A a = mock(A.class);
B b = mock(B.class);

when(a.b(anyInt(), anyInt(), any(C[].class))).thenReturn(b);
assertEquals(b, a.b(1, 2));

这不起作用,但是如果我这样做的话:

代码语言:javascript
运行
复制
when(a.b(anyInt(), anyInt())).thenReturn(b);
assertEquals(b, a.b(1, 2));

这是可行的,尽管我在截断方法时完全省略了varargs参数。

有什么线索吗?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2010-04-14 10:53:22

Mockito1.8.1引入了anyVararg() matcher

代码语言:javascript
运行
复制
when(a.b(anyInt(), anyInt(), Matchers.<String>anyVararg())).thenReturn(b);

另请参阅历史记录:https://code.google.com/archive/p/mockito/issues/62

不推荐使用后编辑新语法:

代码语言:javascript
运行
复制
when(a.b(anyInt(), anyInt(), ArgumentMatchers.<String>any())).thenReturn(b);
票数 257
EN

Stack Overflow用户

发布于 2011-11-03 08:15:02

一个没有文档说明的特性:如果你想开发一个与可变参数匹配的自定义匹配器,你需要让它实现org.mockito.internal.matchers.VarargMatcher才能正常工作。这是一个空的标记接口,如果没有它,Mockito在使用Matcher调用带有varargs的方法时将无法正确地比较参数。

例如:

代码语言:javascript
运行
复制
class MyVarargMatcher extends ArgumentMatcher<C[]> implements VarargMatcher {
    @Override public boolean matches(Object varargArgument) {
        return /* does it match? */ true;
    }
}

when(a.b(anyInt(), anyInt(), argThat(new MyVarargMatcher()))).thenReturn(b);
票数 31
EN

Stack Overflow用户

发布于 2015-06-30 23:40:21

基于Eli Levine的答案,这里有一个更通用的解决方案:

代码语言:javascript
运行
复制
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.mockito.ArgumentMatcher;
import org.mockito.internal.matchers.VarargMatcher;

import static org.mockito.Matchers.argThat;

public class VarArgMatcher<T> extends ArgumentMatcher<T[]> implements VarargMatcher {

    public static <T> T[] varArgThat(Matcher<T[]> hamcrestMatcher) {
        argThat(new VarArgMatcher(hamcrestMatcher));
        return null;
    }

    private final Matcher<T[]> hamcrestMatcher;

    private VarArgMatcher(Matcher<T[]> hamcrestMatcher) {
        this.hamcrestMatcher = hamcrestMatcher;
    }

    @Override
    public boolean matches(Object o) {
        return hamcrestMatcher.matches(o);
    }

    @Override
    public void describeTo(Description description) {
        description.appendText("has varargs: ").appendDescriptionOf(hamcrestMatcher);
    }

}

然后你可以将它与hamcrest的数组匹配器一起使用,如下所示:

代码语言:javascript
运行
复制
verify(a).b(VarArgMatcher.varArgThat(
            org.hamcrest.collection.IsArrayContaining.hasItemInArray("Test")));

(显然,静态导入将使其更具可读性。)

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

https://stackoverflow.com/questions/2631596

复制
相关文章

相似问题

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