Автор оригинала: Pankaj Kumar.
Макетные объекты EasyMock могут быть трех типов – по умолчанию, строгие и приятные. Мы можем указать тип макетного объекта, используя Тип макета перечисление при создании макетного объекта.
Типы макетов EasyMock
- По умолчанию: ожидаются только записанные звонки, но в любом порядке. Тест не завершится неудачей, если будут пропущены какие-либо записанные вызовы.
- Строгий: ожидает только записанные вызовы и в том же порядке, в котором они были записаны.
- Приятно: ожидает записанные вызовы в любом порядке и возвращает пустые значения по умолчанию (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. Аналогично, если мы хотим разрешить прохождение неожиданных вызовов, мы можем использовать хороший макет.