Автор оригинала: Pankaj Kumar.
Одним из ограничений EasyMock является то, что он не может имитировать статические методы. Однако мы можем использовать расширение PowerMock EasyMock для моделирования статических методов.
Статический метод EasyMock – PowerMock
PowerMock разделен на несколько модулей для поддержки платформы тестирования JUnit и TestNG. Аналогичным образом, существуют модули для расширения фреймворков EasyMock и Mockito.
Я приведу пример для моделирования статического метода с использованием PowerMock как в рамках JUnit4, так и в рамках TestNG. Поэтому нам нужно импортировать следующие артефакты.
- powermock-модуль-junit4
- powermock-модуль-тестирование
- powermock-api-easymock
- junit, testng и easymock по очевидным причинам.
Я не использую JUnit 5, потому что PowerMock его еще не поддерживает. Я использую следующие версии для своих примеров.
4.12 6.14.3 2.0.0-beta.5 10 3.6
Пример статического метода JUnit PowerMock EasyMock
- Первым шагом является аннотирование тестового класса с помощью
@RunWith(PowerMockRunner.class)аннотация. - Следующий шаг-указать классы для подготовки к тестированию с помощью PowerMock, например
@PrepareForTest(Utils.class). Это должно быть сделано на уровне класса, и мы можем использовать егополные именадля указания нескольких классов и пакетов. - В методе тестирования используйте
PowerMock.mockStatic()метод для моделирования статических методов класса. - Заглушите поведение с помощью метода
EasyMock.expect (). - Поскольку у нас нет макетного объекта, используйте
PowerMock.replayAll()для завершения настройки. - Используйте утверждения для проверки поведения.
- Используйте
PowerMock.VerifyAll (), чтобы убедиться, что все заглушенные методы были вызваны.
Допустим, у нас есть служебный класс, как:
class Utils {
public static long generateID() {
return System.currentTimeMillis();
}
}
Вот тест JUnit, чтобы поиздеваться над статическим методом и протестировать его.
package com.journaldev.easymock.powermock.staticmethod;
import static org.easymock.EasyMock.*;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.powermock.api.easymock.PowerMock.*;
@RunWith(PowerMockRunner.class)
@PrepareForTest(Utils.class)
public class JUnit4PowerMockEasyMockStaticExample {
@Test
public void test_static_method() {
//PowerMock.mockStatic()
mockStatic(Utils.class);
expect(Utils.generateID()).andReturn(1000L);
//PowerMock.replayAll()
replayAll();
assertEquals(1000L, Utils.generateID());
//PowerMock.verifyAll()
verifyAll();
}
}
Пример статического метода TestNG PowerMock EasyMock
Если вы хотите использовать TestNG вместо JUnit-4, убедитесь, что ваш тестовый класс расширяет PowerMockTestCase класс. Также удалите аннотацию @RunWith . Внесите необходимые изменения в другие аннотации и методы утверждения.
Ниже класс использует тестирование вместе с PowerMock для моделирования статических методов с помощью EasyMock.
package com.journaldev.easymock.powermock.staticmethod;
import static org.easymock.EasyMock.*;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.testng.PowerMockTestCase;
import org.testng.annotations.Test;
import static org.powermock.api.easymock.PowerMock.*;
import static org.testng.Assert.assertEquals;
@PrepareForTest(Utils1.class)
public class TestNGPowerMockEasyMockStaticExample extends PowerMockTestCase{
@Test
public void test_static_method() {
//PowerMock.mockStatic()
mockStatic(Utils1.class);
expect(Utils1.generateID()).andReturn(1000L);
//PowerMock.replayAll()
replayAll();
assertEquals(1000L, Utils1.generateID());
//PowerMock.verifyAll()
verifyAll();
}
}
class Utils1 {
public static long generateID() {
return System.currentTimeMillis();
}
}
Резюме
PowerMock – отличное расширение для фреймворков EasyMock и Mockito. Это помогает нам, расширяя наши тестовые примеры и для моделирования статических методов.