Java Mockito匹配器和基元数组

Java Mockito匹配器和基元数组,java,mockito,Java,Mockito,对于Mockito,我想verify()在其参数列表中使用byte[]的方法调用,但我没有找到如何编写这个 myMethod( byte[] ) 我只想要一些类似于anyByteArray(),如何使用Mockito实现这一点?我会尝试any(byte[].class)尝试以下方法: AdditionalMatchers.aryEq(array); 我宁愿使用匹配器.any()。这对我很有效。我同意穆塔诺斯和阿莱西奥的观点。 此外,可以检查尽可能多的相同方法调用(验证生产代码中的后续调用,

对于Mockito,我想
verify()
在其参数列表中使用
byte[]
的方法调用,但我没有找到如何编写这个

 myMethod( byte[] )
我只想要一些类似于
anyByteArray()
,如何使用Mockito实现这一点?

我会尝试
any(byte[].class)
尝试以下方法:

AdditionalMatchers.aryEq(array);

我宁愿使用
匹配器.any()
。这对我很有效。

我同意穆塔诺斯和阿莱西奥的观点。 此外,可以检查尽可能多的相同方法调用(验证生产代码中的后续调用,验证的顺序无关紧要)。 代码如下:

import static org.mockito.AdditionalMatchers.*;

    verify(mockObject).myMethod(aryEq(new byte[] { 0 }));
    verify(mockObject).myMethod(aryEq(new byte[] { 1, 2 }));
当参数也是数组时,可以使用Mockito.any()。 我是这样用的:

verify(myMock, times(0)).setContents(any(), any());

为此,我使用了
匹配器。refEq

您始终可以使用
argThat

Mockito.verify(yourMockHere).methodCallToBeVerifiedOnYourMockHere(ArgumentMatchers.argThat(new ArgumentMatcher<Object>() {
    @Override
    public boolean matches(Object argument) {
        YourTypeHere[] yourArray = (YourTypeHere[]) argument;
        // Do whatever you like, here is an example:
        if (!yourArray[0].getStringValue().equals("first_arr_val")) {
            return false;
        }
        return true;
    }
}));
Mockito.verify(yourMockHere.methodCallToBeVerifiedOnYourMockHere(ArgumentMatchers.argThat(new ArgumentMatcher()){
@凌驾
公共布尔匹配(对象参数){
YourTypeHere[]yourArray=(YourTypeHere[])参数;
//做你喜欢做的事,下面是一个例子:
如果(!yourArray[0].getStringValue().equals(“first\u arr\u val”)){
返回false;
}
返回true;
}
}));

对我有效的是
org.mockito.ArgumentMatchers.isA

例如:

isA(long[].class)
那很好

彼此的实现差异是:

public static <T> T any(Class<T> type) {
    reportMatcher(new VarArgAware(type, "<any " + type.getCanonicalName() + ">"));
    return Primitives.defaultValue(type);
}

public static <T> T isA(Class<T> type) {
    reportMatcher(new InstanceOf(type));
    return Primitives.defaultValue(type);
}
public static T any(类类型){
reportMatcher(新的VarArgAware(类型“”);
返回原语。默认值(类型);
}
公共静态T isA(类类型){
reportMatcher(新实例of(type));
返回原语。默认值(类型);
}

如果要验证特定字节[],可以使用
AdditionalMatchers.aryEq(expectedArray)
或Matchers.any()。您真的不在乎字节数组的内容是什么吗?我在单元测试中经常看到这一点,在单元测试中,人们使用anyX()匹配器是因为它们很方便,但实际上,您几乎总是应该关心传入的内容。如果您没有使用实际消耗该值的答案,您可能应该匹配实际的预期参数。@Matunos:这是有争议的。使用“任意匹配器”可以使测试更简单,下一个查看测试的人不会因为不必要的精确匹配而分心,并且可以专注于测试的实际目的。@tbruelle:请记住Java中的每个数组都是一个对象。这将从一开始就对您有所帮助。警告大家:现在不推荐使用Mockito,所以我选择投票答案Mockito。当Mockito能够处理此用例时,任何(byte[].class)编写自定义匹配器都只会增加技术债务。在我的用例中,我需要匹配一个数组,但不可能知道其顺序。我找不到匹配数组顺序不可知的Mockito匹配器,在本例中,我发现
argThat(ArgumentMatcher
工作得很好,并且没有增加太多的复杂性。可能在需要验证前几个字节的情况下很有用,等等。。。