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

EasyMock Приятный и строгий Макет

Тип макета EasyMock, строгий макет объекта EasyMock, хороший макет объекта EasyMock, проверка строгих и хороших макетов объектов EasyMock, учебник по типу макета объекта EasyMock

Автор оригинала: Pankaj Kumar.

Макетные объекты EasyMock могут быть трех типов – по умолчанию, строгие и приятные. Мы можем указать тип макетного объекта, используя Тип макета перечисление при создании макетного объекта.

Типы макетов EasyMock

  1. По умолчанию: ожидаются только записанные звонки, но в любом порядке. Тест не завершится неудачей, если будут пропущены какие-либо записанные вызовы.
  2. Строгий: ожидает только записанные вызовы и в том же порядке, в котором они были записаны.
  3. Приятно: ожидает записанные вызовы в любом порядке и возвращает пустые значения по умолчанию (0, null, false) для неожиданных вызовов.

Мы можем создать строгий или красивый макет объекта, указав его тип макета.

Object mock = mock(MockType.STRICT, Object.class);

Object mock1 = mock(MockType.NICE, Object.class);

Если вы используете аннотацию @Mock , вы можете указать тип макета любым из следующих способов.

@Mock(MockType.STRICT)
Object obj;

@Mock(type=MockType.NICE)
Object obj1;

Пример строгого макета EasyMock

Давайте рассмотрим простой пример строгого макетного типа. Мы запишем несколько вариантов поведения макетного объекта ArrayList и повторим их в том же порядке.

package com.journaldev.easymock;

import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.mock;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.util.ArrayList;

import org.easymock.MockType;
import org.junit.jupiter.api.Test;

public class EasyMockStrictMockExample {

	@Test
	public void test() {
		ArrayList mockList = mock(MockType.STRICT, ArrayList.class);
		expect(mockList.add(10)).andReturn(true);
		expect(mockList.add(20)).andReturn(true);
		expect(mockList.size()).andReturn(2);
		expect(mockList.get(0)).andReturn(10);
		replay(mockList);

		mockList.add(10);
		mockList.add(20);
		assertEquals(mockList.size(), 2);
		assertTrue(mockList.get(0) == 10);

		verify(mockList);
	}
}

Если для строгого фиктивного объекта вызывается неожиданный метод, в сообщении об ошибке будут показаны вызовы метода, ожидаемые на данный момент, за которыми последует первый вызов конфликтующего метода.

Если есть пропущенные вызовы, то в сообщении об ошибке метода verify() будут показаны все пропущенные вызовы методов.

EasyMock Хороший Пример Для Подражания

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

package com.journaldev.easymock;

import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.mock;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.assertFalse;

import java.util.ArrayList;

import org.easymock.Mock;
import org.easymock.MockType;
import org.junit.jupiter.api.Test;

public class EasyMockNiceMockExample {
	
	@Test
	public void test() {
		ArrayList mockList = mock(MockType.NICE, ArrayList.class);
		expect(mockList.add(10)).andReturn(true);
		expect(mockList.size()).andReturn(2);
		expect(mockList.get(0)).andReturn(10);
		replay(mockList);

		mockList.add(10);
		// below will NOT throw exception because of nice mock
		boolean b = mockList.add(30);
		assertFalse(b);

		assertEquals(mockList.size(), 2);

		assertTrue(mockList.get(0) == 10);
		//verify won't throw error for unexpected calls for nice mock
		verify(mockList);
	}
}

Резюме

Строгое издевательство EasyMock может быть удобно, когда наши методы тестирования должны вызываться в определенном порядке. Например, издевательство над операциями CRUD. Аналогично, если мы хотим разрешить прохождение неожиданных вызовов, мы можем использовать хороший макет.