Рубрики
Без рубрики

Сопоставители аргументов EasyMock

Сопоставители аргументов EasyMock, сопоставитель любых аргументов EasyMock, совпадения строк, пользовательские совпадения, числа, условные, не, и, или, lt, gt, leq, пример кода geq

Автор оригинала: 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 mockList = mock(ArrayList.class);
		expect(mockList.add(anyInt())).andReturn(true);
		expect(mockList.add(anyString())).andReturn(false);
		replay(mockList);

		assertTrue(mockList.add(10));
		assertFalse(mockList.add("Hi"));
		
		verify(mockList);
	}
}

Обратите внимание на использование любого вида() и любой строки() для указания аргумента в качестве любого объекта 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() {
		List mock = 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() {
		List mock = 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 mock = mock(ArrayList.class);

expect(mock.add(isNull())).andReturn(true);
expect(mock.add(notNull())).andReturn(false);
replay(mock);

assertTrue(mock.add(null));
assertFalse(mock.add("Hi"));

Строковый Аргумент Совпадает

Существует несколько полезных методов, особенно для сопоставления строковых аргументов. Это:

  • Стартсвит(Строка)
  • Конец(строка)
  • содержит(Строка)
  • соответствует(регулярное выражение): Ожидает, что строка аргумента будет соответствовать регулярному выражению.
  • найти(регулярное выражение): Ожидает, что одна из подстрок будет соответствовать регулярному выражению.

Вот простой пример, показывающий использование совпадений строковых аргументов.

List mock = 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) .