Автор оригинала: Pankaj Kumar.
Аннотации EasyMock можно использовать для создания макетов объектов. Мы также можем сказать фреймворку EasyMock, чтобы он внедрил эти фиктивные объекты в другой конкретный класс.
Аннотации EasyMock
Есть две важные аннотации EasyMock, о которых мы должны знать:
@Mock: Используется для указания поля, над которым будет издеваться EasyMock.@TestSubject: Используется для указания объекта, в который мы хотим, чтобы EasyMock вставлял поддельные объекты, созданные с помощью аннотации @Mock.
Пример аннотаций EasyMock
Когда мы используем аннотации EasyMock, мы должны явно инициализировать их одним из следующих методов.
@RunWith(EasyMockRunner.class): Мы можем использовать это, если мы используем JUnit 4, обратите внимание, что JUnit 5 все еще не поддерживает это. Если мы будем использовать это с JUnit 5, то это приведет к отказу от использования классов JUnit 4runner.организация.easymock.EasyMockRule: Здесь используется правило JUnit4, поэтому его снова нельзя использовать с JUnit 5.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 позволяют нам создавать насмешки на глобальном уровне, мы можем повторно использовать эти насмешки в различных методах тестирования, а также внедрять их в различные другие объекты, зависящие от них.