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

Учебник по EasyMock, пример EasyMock JUnit 5, EasyMock против Mockito, макет интерфейса и классов EasyMock, @Макет EasyMock, аннотации @TestSubject пример

Учебник по EasyMock, пример EasyMock JUnit 5, EasyMock против Mockito, макет интерфейса и классов EasyMock, @Макет EasyMock, аннотации @TestSubject пример

Автор оригинала: 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() {
		ArrayList mockList = 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.

Ссылка: Официальное руководство пользователя