Автор оригинала: Pankaj Kumar.
EasyMock-это платформа для насмешек на основе java, которая используется в сочетании с другими платформами модульного тестирования, такими как JUnit и TestNG . EasyMock очень похож на рамки для насмешек Mockito.
EasyMock позволяет нам создавать макеты объектов интерфейсов и конкретных классов и определять их поведение. Затем мы можем использовать эти насмешки для написания кода для тестирования наших основных классов. Таким образом, написание модульных тестов упрощается, поскольку нам не нужно заботиться о внешних зависимостях.
EasyMock
Мы можем использовать EasyMock для создания макетных объектов, а затем внедрять их в классы, которые мы хотим протестировать. Однако у EasyMock тоже есть определенные ограничения.
- EasyMock не может издеваться над окончательными и частными методами. Если эти методы вызываются для макетного объекта, то будут вызываться обычные методы.
- EasyMock обеспечивает встроенное поведение для методов equals() , toString(), hashCode() и finalize (). Это означает, что мы не можем записать ваше собственное поведение для этих методов.
Зависимости EasyMock Maven
Мы можем добавить следующие зависимости в ваш проект maven для использования платформы насмешек EasyMock.
org.easymock easymock 3.6 test
Учебник по EasyMock
Давайте создадим несколько примеров классов и сервисов для насмешек. Мы будем использовать JUnit 5 для написания тестовых примеров вместе с EasyMock для создания макетов объектов.
package com.journaldev.utils; public interface Calculator { int add(int x, int y); int multiply(int x, int y); }
package com.journaldev.utils; public class MathUtils { private Calculator calc; public MathUtils(Calculator c) { this.calc = c; } public int add(int i, int j) { return this.calc.add(i, j); } public int multiply(int i, int j) { return this.calc.multiply(i, j); } }
Обратите внимание, что нам не нужна реализация калькулятора для написания наших тестовых примеров, потому что мы издеваемся над ними. Таким образом, мы можем применить модель разработки на основе тестирования (TDD) в нашем приложении.
Большинство полезных методов представлены в org.easymock.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.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.ArrayList; import org.junit.jupiter.api.Test; public class EasyMockMethodExample { @Test public void test() { ArrayListmockList = mock(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); // below will throw exception because it's not mocked // mockList.add(30); assertTrue(mockList.get(0) == 10); assertEquals(mockList.size(), 2); } }
Некоторые важные моменты, которые следует отметить из приведенного выше примера EasyMock, заключаются в следующем:
- Первый шаг-создать макет объекта с помощью метода EasyMock
mock ()
. Этот метод перегружен , где мы можем указать, хотим ли мы, чтобы наш макет объекта был красивым или строгим. Мы также можем указать имя, которое будет использоваться в случае исключений ведения журнала. Мы рассмотрим различныеТип макета
примеры в будущих сообщениях. - Следующий шаг-заглушить поведение и вывод вызова метода с помощью операторов
expect()
ии Return()
chain. - Наконец, мы должны вызвать метод
replay ()
, чтобы начать использовать методы-заглушки для макетных объектов. - Если мы вызовем метод, который не заглушен, мы получим
java.lang.Ошибка утверждения
.
Аннотации EasyMock – @Макет, @TestSubject
EasyMock также предоставляет несколько аннотаций для создания макетных объектов.
@Mock
: Используется для указания поля, над которым будет издеваться EasyMock.@TestSubject
: Используется с полем, чтобы EasyMock вводил в его поля насмешки, созданные с помощью @Mock.
При использовании аннотаций мы должны использовать EasyMockRunner
, EasyMockRule
или |/EasyMockSupport.InjectMocks(объект) для инициализации и введения фиктивных объектов. Поскольку мы используем JUnit-5, мы не можем использовать EasyMockRunner и EasyMockRule, поскольку они еще не поддерживаются. Поэтому нам придется использовать
EasyMockSupport.InjectMocks(объект) . Мы можем вызвать этот метод в
@beforeEach методе.
Вот полный пример насмешки над объектами с использованием аннотаций EasyMock.
package com.journaldev.easymock; import static org.easymock.EasyMock.*; import static org.junit.jupiter.api.Assertions.*; import org.easymock.EasyMockSupport; import org.easymock.Mock; import org.easymock.TestSubject; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import com.journaldev.utils.Calculator; import com.journaldev.utils.MathUtils; public class EasyMockAnnotationExample { @Mock private Calculator mockCalculator; @TestSubject private MathUtils mathUtils = new MathUtils(mockCalculator); @BeforeEach public void setup() { EasyMockSupport.injectMocks(this); } @Test public void test() { expect(mockCalculator.add(1, 1)).andReturn(2); expect(mockCalculator.multiply(10, 10)).andReturn(100); replay(mockCalculator); assertEquals(mathUtils.add(1, 1), 2); assertEquals(mathUtils.multiply(10, 10), 100); } }
Заглушка в стиле итератора EasyMock
Мы можем указать различные варианты поведения для одних и тех же вызовов методов, связав их цепочкой с times()
. Давайте рассмотрим простой пример, чтобы ясно это понять.
//Iterator Style Mocking reset(mockList); expect(mockList.size()).andReturn(1).times(2) //return 1 for first 2 calls .andReturn(2).times(1) //return 2 for 3rd call .andReturn(4); //return 4 for 4th call replay(mockList); assertEquals(mockList.size(), 1); assertEquals(mockList.size(), 1); assertEquals(mockList.size(), 2); assertEquals(mockList.size(), 4);
Резюме
EasyMock-это простой инструмент для создания макетов объектов и простого написания модульных тестов. Он очень похож на Mockito и предоставляет почти те же функции, что и Mockito.