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

Аннотации EasyMock – JUnit 4

Аннотации EasyMock, EasyMock @Макет, EasyMock @TestSubject, EasyMock вводит макетные объекты, EasyMockRule, EasyMockRunner, пример инъекций EasyMockSupport

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

Аннотации EasyMock можно использовать для создания макетов объектов. Мы также можем сказать фреймворку EasyMock, чтобы он внедрил эти фиктивные объекты в другой конкретный класс.

Аннотации EasyMock

Есть две важные аннотации EasyMock, о которых мы должны знать:

  1. @Mock : Используется для указания поля, над которым будет издеваться EasyMock.
  2. @TestSubject : Используется для указания объекта, в который мы хотим, чтобы EasyMock вставлял поддельные объекты, созданные с помощью аннотации @Mock.

Пример аннотаций EasyMock

Когда мы используем аннотации EasyMock, мы должны явно инициализировать их одним из следующих методов.

  1. @RunWith(EasyMockRunner.class) : Мы можем использовать это, если мы используем JUnit 4, обратите внимание, что JUnit 5 все еще не поддерживает это. Если мы будем использовать это с JUnit 5, то это приведет к отказу от использования классов JUnit 4runner.
  2. организация.easymock.EasyMockRule : Здесь используется правило JUnit4, поэтому его снова нельзя использовать с JUnit 5.
  3. EasyMockSupport.InjectMocks(это) : Мы можем использовать это в методах @Before, чтобы указать EasyMock вводить фиктивные объекты. Это предпочтительный способ для JUnit 5 и Тестирования фреймворков.

Давайте рассмотрим пример использования всех вышеперечисленных методов для создания макетов объектов с помощью EasyMock.

Прежде всего, мы создадим несколько классов для насмешек. Я буду использовать JUnit 4 для нашего примера, чтобы продемонстрировать все три способа создания макетов объектов с помощью аннотаций EasyMock.

package com.journaldev.utils;

public interface IntegerUtils {

	int add(int x, int y);
}
package com.journaldev.utils;

public interface StringUtils {

	String reverse(String input);
	
	String convert(int i);
}

Мы создадим макетные объекты вышеуказанных интерфейсов и введем их в следующий конкретный класс.

package com.journaldev.utils;

public class MyUtils {

	private StringUtils su;
	private IntegerUtils iu;
	
	public MyUtils(StringUtils su, IntegerUtils iu) {
		this.su = su;
		this.iu = iu;
	}
	
	public int add(int i, int j) {
		return iu.add(i, j);
	}
	
	public String reverse(String s) {
		return su.reverse(s);
	}
	
	public String convert(int i) {
		return su.convert(i);
	}
}

EasyMockRunner

Вот тестовый класс, использующий @RunWith(EasyMockRunner.class) с аннотациями EasyMock.

package com.journaldev.easymock;

import static org.easymock.EasyMock.*;
import static org.junit.Assert.*;

import org.easymock.EasyMockRunner;
import org.easymock.Mock;
import org.easymock.TestSubject;
import org.junit.Test;
import org.junit.runner.RunWith;

import com.journaldev.utils.IntegerUtils;
import com.journaldev.utils.MyUtils;
import com.journaldev.utils.StringUtils;

@RunWith(EasyMockRunner.class)
public class EasyMockAnnotationsRunWithExample {

	@Mock StringUtils mockSU;
	@Mock IntegerUtils mockIU;

	@TestSubject MyUtils mu = new MyUtils(mockSU, mockIU);

	@Test
	public void test() {
		expect(mockIU.add(10, 10)).andReturn(20);
		expect(mockSU.convert(10)).andReturn("10");
		expect(mockSU.reverse("CAT")).andReturn("TAC");

		replay(mockSU, mockIU);

		assertEquals(20, mu.add(10, 10));
		assertEquals("10", mu.convert(10));
		assertEquals("TAC", mu.reverse("CAT"));
	}

}

Обратите внимание, что на издевательских объектах выполняется заглушка поведения. Они вызываются внутренне, когда мы вызываем методы для объекта-объекта тестирования.

EasyMockRule

Вот фрагмент кода для использования EasyMockRule . Я удалил код из метода тестирования, потому что он такой же, как и предыдущий метод тестирования.

package com.journaldev.easymock;

import static org.easymock.EasyMock.*;
import static org.junit.Assert.*;

import org.easymock.EasyMockRule;
import org.easymock.Mock;
import org.easymock.TestSubject;
import org.junit.Rule;
import org.junit.Test;

import com.journaldev.utils.IntegerUtils;
import com.journaldev.utils.MyUtils;
import com.journaldev.utils.StringUtils;

public class EasyMockAnnotationsEasyMockRuleExample {

	@Mock StringUtils su;
	@Mock IntegerUtils iu;

	@TestSubject MyUtils mu = new MyUtils(su, iu);

	@Rule
	public EasyMockRule easyMockRule = new EasyMockRule(this);

	@Test
	public void test() {
	}

}

EasyMockSupport.InjectMocks()

package com.journaldev.easymock;

import static org.easymock.EasyMock.*;
import static org.junit.Assert.*;

import org.easymock.EasyMockSupport;
import org.easymock.Mock;
import org.easymock.TestSubject;
import org.junit.Before;
import org.junit.Test;

import com.journaldev.utils.IntegerUtils;
import com.journaldev.utils.MyUtils;
import com.journaldev.utils.StringUtils;

public class EasyMockAnnotationsInjectExample {

	@Mock
	StringUtils su;
	@Mock
	IntegerUtils iu;

	@TestSubject
	MyUtils mu = new MyUtils(su, iu);

	@Before
	public void setup() {
		EasyMockSupport.injectMocks(this);
	}
	
	@Test
	public void test() {
	}

}

Этот способ создания насмешек будет работать с JUnit 5, а также с платформой тестирования TestNG.

Резюме

Аннотации EasyMock позволяют нам создавать насмешки на глобальном уровне, мы можем повторно использовать эти насмешки в различных методах тестирования, а также внедрять их в различные другие объекты, зависящие от них.