Автор оригинала: Pankaj Kumar.
Сопоставители аргументов EasyMock позволяют нам предоставлять гибкие аргументы для сопоставления при отключении методов. В EasyMock вы найдете множество любых*()
методов, которые можно использовать с expect()
для предоставления аргументов для вызова метода.
Пример сопоставителей аргументов EasyMock
Давайте рассмотрим простой пример насмешки над ArrayList и подавления его поведения для любого аргумента определенного типа.
package com.journaldev.easymock; import static org.easymock.EasyMock.*; import static org.junit.jupiter.api.Assertions.*; import java.util.ArrayList; import org.junit.jupiter.api.Test; public class EasyMockAgrumentMatcherExample { @Test public void test() { ArrayList
Обратите внимание на использование любого вида()
и любой строки()
для указания аргумента в качестве любого объекта int или строки.
Помимо сопоставления любого аргумента, существуют и другие сопоставители аргументов. Давайте рассмотрим некоторые из этих сопоставителей аргументов с примером кода.
Сопоставитель Аргументов Равенства
Мы можем использовать same()
метод сопоставления аргументов для стиблирования поведения с одним и тем же объектом. Если вы хотите выполнить проверку качества, используйте метод eq ()
.
package com.journaldev.easymock; import static org.easymock.EasyMock.*; import static org.junit.jupiter.api.Assertions.*; import java.util.ArrayList; import org.junit.jupiter.api.Test; public class EasyMockAgrumentMatcherEqualityExample { @Test public void test() { Utils mock = mock(Utils.class); Object obj = new Object(); expect(mock.convert(same(obj))).andReturn("True"); expect(mock.convert(eq("ABC"))).andReturn("Awesome"); expect(mock.convert(anyObject())).andReturn("False"); replay(mock); assertEquals("True", mock.convert(obj)); assertEquals("Awesome", mock.convert("ABC")); assertEquals("False", mock.convert(new Object())); } } class Utils { public String convert(Object obj) { return obj.toString(); } }
Сопоставитель Аргументов Сравнения
Мы можем использовать lt()
, gt()
, leq()
и geq()
методы для сравнения аргументов и возврата определенных выходных данных. Обратите внимание, что эти методы перегружены для использования как с примитивными типами данных, так и с объектами. Если вы используете их с каким-либо объектом, то они должны быть Сопоставимы
.
package com.journaldev.easymock; import static org.easymock.EasyMock.*; import static org.junit.jupiter.api.Assertions.*; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Test; public class EasyMockAgrumentMatcherComparisonExample { @Test public void test() { Listmock = mock(ArrayList.class); expect(mock.add(lt(10))).andReturn(true); expect(mock.add(geq(10))).andReturn(false); replay(mock); assertTrue(mock.add(5)); assertFalse(mock.add(100)); } }
Сопоставители Условных Аргументов
Мы можем использовать и()
, или()
и не()
функции с сопоставителями аргументов для написания более сложных моделей поведения.
Обратите внимание, что когда мы используем сопоставители аргументов для заглушки поведения, каждый аргумент должен быть сопоставителем, иначе мы получим сообщение об ошибке. Поэтому , если нам нужно указать не(100)
, то запишите его как не(эквалайзер(100))
.
Вот простой пример использования сопоставителей условных аргументов.
package com.journaldev.easymock; import static org.easymock.EasyMock.*; import static org.junit.jupiter.api.Assertions.*; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Test; public class EasyMockAgrumentMatcherConditionalExample { @Test public void test() { Listmock = mock(ArrayList.class); //return true if number is between 0 to 10 expect(mock.add(and(gt(0), lt(10)))).andReturn(true); //return true if number is 33 or 77 expect(mock.add(or(eq(33), eq(77)))).andReturn(true); //return true if number is not 99 expect(mock.add(not(lt(100)))).andReturn(false); replay(mock); assertTrue(mock.add(5)); assertTrue(mock.add(33)); assertFalse(mock.add(102)); } }
Сопоставители Нулевых Аргументов
Мы можем использовать isNull()
и NotNull()
для сопоставления нулевых и ненулевых аргументов. Однако isNull()
удобен, когда мы используем другие сопоставители аргументов и не можем использовать null напрямую.
List
Строковый Аргумент Совпадает
Существует несколько полезных методов, особенно для сопоставления строковых аргументов. Это:
- Стартсвит(Строка)
- Конец(строка)
- содержит(Строка)
- соответствует(регулярное выражение): Ожидает, что строка аргумента будет соответствовать регулярному выражению.
- найти(регулярное выражение): Ожидает, что одна из подстрок будет соответствовать регулярному выражению.
Вот простой пример, показывающий использование совпадений строковых аргументов.
Listmock = mock(ArrayList.class); expect(mock.add(startsWith("Java"))).andReturn(true); expect(mock.add(endsWith("Dev"))).andReturn(true); expect(mock.add(contains("Pyt"))).andReturn(true); expect(mock.add(matches("^[abc]d."))).andReturn(true); expect(mock.add(find("[9]{3}"))).andReturn(true); replay(mock); //startsWith Java assertTrue(mock.add("Java World")); //endsWith Dev assertTrue(mock.add("JournalDev")); //contains Pyt assertTrue(mock.add("Python")); //matches ads assertTrue(mock.add("ads")); // 999 is one of substring assertTrue(mock.add("ABC999DDD")); verify(mock);
Сопоставитель Пользовательских Аргументов
Хотя поддержка сопоставителей аргументов EasyMock обширна, если вы хотите реализовать пользовательский сопоставитель аргументов, вы можете реализовать IArgumentMatcher
интерфейс и используйте его через EasyMock.reportMatcher(IArgumentMatcher)
.