如何使用Mockito截取正常对象数组的参数?

时间:2018-11-13 18:30:56

标签: java mocking mockito

这听起来像是一个非常简单的问题,但是我真的很难将解决方案存档。

通常我会很轻松地嘲笑和匹配我的论点。

现在我正在匹配一个像这样的方法:

getAppFacebookClient(page, V2_11).publish(destination, JsonObject.class, parameters.asArray());

这是用于facebook应用程序,参数是自定义对象的列表。 asArray []方法是在类中创建的,基本上可以执行以下操作:

public Parameter[] asArray() {
        return parameters.toArray(new Parameter[parameters.size()]);
    }

,此返回的参数类型为com.restfb.Parameter

所以,我基本上是这样做的

when(client.publish(anyString(), eq(JsonObject.class), any(com.restfb.Parameter[].class))).thenReturn(result);

但似乎从未使用过,当然我也无法操纵结果,

有什么主意我该如何以适当的方式模拟这种对象?

我也尝试了另一种方式

doReturn(result).when(client).publish(anyString(), eq(JsonObject.class), any(com.restfb.Parameter[].class));

1 个答案:

答案 0 :(得分:1)

您的代码是正确的...除非publish使用varargs!

在这种情况下,您需要使用any() / anyVararg()匹配器。

考虑:

@Mock Thingy testee;

interface Thingy {
    int f(String... arg);
}

@Test
public void test() {
    // given
    // works only if signature is `f(String[] arg)`
    // when(this.testee.f(Mockito.any(String[].class))).thenReturn(42);
    when(this.testee.f(Mockito.any())).thenReturn(42); // anyVararg() is deprecated

    // when
    final int result = this.testee.f(new String[] { "hello", "world" });

    // then
    assertThat(result, comparesEqualTo(42));
    // works only if signature is `f(String[] arg)`
    // verify(this.testee).f(Mockito.any(String[].class));
    verify(this.testee).f(Mockito.any());
}