Mockito匹配器和原语数组


226

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

 myMethod( byte[] )

我只想要像anyByteArray()Mockito那样的东西?


您真的不在乎字节数组的内容是什么吗?我在单元测试中看到了很多东西,因为人们很方便,所以人们使用anyX()匹配器,但是实际上,您几乎总是应该关心传递的内容。如果您不使用实际上消耗值的Answer,则可能应该与实际的预期参数匹配。
Matunos

@Matunos:这值得商.。使用任意匹配器可以使测试变得更简单,并且不必担心不必要的精确匹配而使下一个看测试的人分心,并且可以专注于测试的实际目的。
马里克·阿塔拉

@tbruelle:请记住,Java中的每个数组都是一个对象。一开始会对您有帮助。
Tomasz Przybylski

Answers:


424

我会尝试 any(byte[].class)


34
如果您想验证特定的字节[],则可以使用AdditionalMatchers.aryEq(expectedArray)
John Oxley

5
或Matchers。<byte []> any()。
jbyler 2013年



10

我同意Mutanos和Alecio。此外,可以检查尽可能多的相同方法调用(验证生产代码中的后续调用,验证的顺序无关紧要)。这是代码:

import static org.mockito.AdditionalMatchers.*;

    verify(mockObject).myMethod(aryEq(new byte[] { 0 }));
    verify(mockObject).myMethod(aryEq(new byte[] { 1, 2 }));


0

当参数也是数组时,可以使用Mockito.any()。我这样使用它:

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

0

对我有用的是 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);
}

-1

您始终可以使用创建自定义匹配器 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能够处理此用例时,编写自定义匹配器只会增加技术负担。
linuxdan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.