2

我需要一个 ArgumentMatcher 接受对象数组 (Object[]) 中的任何类型的值。测试对象:

class ObjectArrayMethod {
    public int call(Object... objects) {
        return 0;
    }
}

我尝试了这些,所有 assertEquals 都失败了:

    ObjectArrayMethod method = Mockito.mock(ObjectArrayMethod.class);

    Object[] arg = {"", ""};
    Mockito.when(method.call(AdditionalMatchers.aryEq(arg))).thenReturn(15);
    int actual = method.call(arg);
    assertEquals(15, actual);

    ObjectArrayMethod method = Mockito.mock(ObjectArrayMethod.class);

    Mockito.when(method.call(any(Object[].class))).thenReturn(15);
    Object[] arg = new Object[] {null, null};
    int actual = method.call(arg);
    assertEquals(15, actual);

甚至失败:

    ObjectArrayMethod method = Mockito.mock(ObjectArrayMethod.class);

    Object[] arg = {"", ""};
    Mockito.when(method.call(AdditionalMatchers.aryEq(arg))).thenReturn(15);
    int actual = method.call(arg);
    assertEquals(15, actual);

我写了一个自己的匹配器:

    protected static class ObjectArrayArgumentMatcher implements ArgumentMatcher<Object[]>, VarargMatcher {

    private static final long serialVersionUID = 3846783742617041128L;
    private final Object[] values;
    private ErrorState errorState = NO_ERROR;

    protected ObjectArrayArgumentMatcher(Object[] values) {
        this.values = values;
    }

    @Override
    public boolean matches(Object[] argument) {

        if (values == null) {
            return true;
        }

        if (argument == null) {
            return false;
        }

        return true;
    }

}

    protected static class ObjectArrayArgumentMatcher2 extends ObjectArrayArgumentMatcher {

    private static final long serialVersionUID = 3085412884910289910L;

    protected ObjectArrayArgumentMatcher2(Object... values) {
        super(values);
    }

    @Override
    public boolean matches(Object... argument) {
        return super.matches(argument);
    }

}

我用空值初始化。但我没有被叫到。

下一步当然是比较参数。

为什么使用 args {""、""} 甚至 {null, null} 调用更近的匹配(对象 [] 参数)或匹配(对象...参数)?

我需要的是一个 ArgumentMatcher,它适用于任何对象数组,即使是像 {"String", 1, new Object()} 这样的混合类型。

我最终要模拟的方法是

int org.springframework.jdbc.core.JdbcTemplate.update(String sql, Object... args) throws DataAccessException

我在用

            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>2.22.0</version>

顺便提一句。使用版本 1.10.19 我的 ObjectArrayArgumentMatcher 工作。

4

1 回答 1

1

最后这篇文章帮助我找到了解决方案: 如何在 Mockito 中正确匹配可变参数

这有效:

Mockito.when(method.call(ArgumentMatchers.<Object>any())).thenReturn(10);
于 2018-10-05T16:53:12.220 回答