Использовать совпадения Mockito для элементов массива - PullRequest
0 голосов
/ 30 октября 2018

У меня есть такой метод:

String m(String s, Object[] args);

и я могу указать для него поведение, например:

when(x.m(
            eq("expected string"), 
            Matchers.<Object[]>any()
)).thenReturn(expectedValue);

Но я хочу быть более конкретным и иметь возможность указать что-то вроде "любой массив, который имеет 2 элемента, где второй является нулевым" . Итак, в качестве «псевдокода» я хочу использовать:

when(x.m(
            eq("expected string"), 
            Matchers.<Object[]>any(){anyString(), isNull()}
)).thenReturn(expectedValue);

Возможно ли это в Мокито?

В качестве обходного пути я мог бы использовать verify для проверки типа элементов из этого массива, но я бы хотел проверить их в методе when.

1 Ответ

0 голосов
/ 30 октября 2018

Вы можете использовать Mockito argTaht, чтобы использовать свой собственный сопоставитель. В вашем случае вы можете реализовать это так:

when(x.m(anyString(), argThat((Object[] o) -> o.length == 2 && o[0] instanceof String && o[1] == null)))
                .thenReturn("mocked value");

Конечно, вы можете добавить дополнительную проверку и проверить, если это необходимо. И теперь, если вы назовете это так, вы получите поддельное значение:

String mocked = x.m("string", new Object[]{"string", null});
assertEquals("mocked value", mocked);

Любой другой вызов вернет null:

String notMocked = x.m("string", new Object[]{"string", "string"});
assertNull(notMocked);
...