как перехватить параметр с mockito для обычного массива объектов? - PullRequest
0 голосов
/ 13 ноября 2018

Это может звучать как очень простой вопрос, но я действительно изо всех сил пытаюсь заархивировать решение.

Обычно я довольно легко высмеиваю и сопоставляю свои аргументы.

Теперь я сопоставляю метод, подобный этому:

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 голосов
/ 13 ноября 2018

Ваш код правильный ... если publish не использует varargs!

В таком случае вам нужно использовать any() / anyVararg() matcher.

Рассмотрим:

@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());
}
...