Поиск по сайту:

Сопоставители аргументов Mockito — any(), eq()


Mockito позволяет нам создавать фиктивные объекты и заглушать поведение для наших тестовых случаев. Обычно мы имитируем поведение, используя when() и thenReturn() для фиктивного объекта.

Сопоставители аргументов Mockito — любые()

Иногда мы хотим имитировать поведение любого аргумента данного типа, в этом случае мы можем использовать сопоставители аргументов Mockito. Методы аргументов Mockito определены в классе org.mockito.ArgumentMatchers как статические методы. Допустим, у нас есть класс, определенный как:

class Foo {
	boolean bool(String str, int i, Object obj) {
		return false;
	}

	int in(boolean b, List<String> strs) {
		return 0;
	}
	
	int bar(byte[] bytes, String[] s, int i) {
		return 0;
	}
}

Давайте посмотрим на несколько примеров использования сопоставителей аргументов mockito для подавления общего поведения.

Foo mockFoo = mock(Foo.class);
when(mockFoo.bool(anyString(), anyInt(), any(Object.class))).thenReturn(true);

Мы заглушаем метод bool(), чтобы он возвращал «true» для любых строковых, целых и объектных аргументов. В этом случае все следующие утверждения будут проходить:

assertTrue(mockFoo.bool("A", 1, "A"));
assertTrue(mockFoo.bool("B", 10, new Object()));

Сопоставитель аргументов Mockito — eq()

Когда мы используем сопоставители аргументов, то все аргументы должны использовать сопоставители. Если мы хотим использовать определенное значение для аргумента, мы можем использовать метод eq().

when(mockFoo.bool(eq("false"), anyInt(), any(Object.class))).thenReturn(false);
assertFalse(mockFoo.bool("false", 10, new Object()));

Существуют также сопоставители аргументов для списка, набора и карты.

when(mockFoo.in(anyBoolean(), anyList())).thenReturn(10);

Если вы хотите сопоставить массивы, используйте метод any() следующим образом:

any(byte[].class)
any(Object[].class)

Дополнительные соответствия Mockito

Класс Mockito org.mockito.AdditionalMatchers предоставляет некоторые редко используемые сопоставители. Мы можем указать аргументы, чтобы быть больше, меньше, выполнять операции ИЛИ, И, НЕ. Мы также можем проверить равенство массивов.

when(mockFoo.bar(any(byte[].class), aryEq(new String[] { "A", "B" }), gt(10))).thenReturn(11);

Таким образом, если мы вызовем метод bar() с любым массивом байтов в качестве аргумента, вторым аргументом в виде {\A, \B} и третьим аргументом больше 10, то метод-заглушка вернет 11. Нижеприведенные утверждения будут проходить для нашего заглушенный метод.

assertEquals(11, mockFoo.bar("abc".getBytes(), new String[] { "A", "B" }, 20));
assertEquals(11, mockFoo.bar("xyz".getBytes(), new String[] { "A", "B" }, 99));

Mockito Проверка соответствия аргументов

Сопоставители аргументов Mockito можно использовать только с методами when() и verify(). Давайте рассмотрим несколько примеров использования сопоставителей аргументов в методе проверки Mockito.

verify(mockFoo, atLeast(0)).bool(anyString(), anyInt(), any(Object.class));
verify(mockFoo, atLeast(0)).bool(eq("false"), anyInt(), any(Object.class));

Резюме

Методы сопоставления аргументов Mockito очень полезны для общего заглушения поведения. Есть много методов, чтобы покрыть почти все требования.

Вы можете посмотреть другие примеры Mockito в нашем репозитории GitHub.