Автор оригинала: 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(Data.class)
. Это должно быть сделано на уровне класса, и мы можем использовать егополные имена
для указания нескольких классов и пакетов. - В методе тестирования используйте
PowerMock.createMock()
метод для макетирования конечного класса. - Заглушите поведение с помощью метода
EasyMock.expect ()
. - Используйте
PowerMock.replay()
для завершения настройки макета объекта и его поведения. - Используйте утверждения JUnit 4 для проверки поведения.
- Используйте
PowerMock.verify ()
, чтобы убедиться, что были вызваны все заглушенные конечные методы.
Допустим, у нас есть заключительный урок, как:
final class Data { final String reverse(String s) { return new StringBuffer(s).reverse().toString(); } }
Вот тест JUnit, чтобы поиздеваться над окончательным классом и его окончательным методом и протестировать его.
package com.journaldev.easymock.powermock.finalmethod; 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.*; import static org.easymock.EasyMock.expect; import static org.junit.Assert.assertEquals; import static org.easymock.EasyMock.anyString; @RunWith(PowerMockRunner.class) @PrepareForTest(Data.class) public class JUnit4PowerMockEasyMockFinalExample { @Test public void test_final_method_class() { //PowerMock.createMock() Data mock = createMock(Data.class); expect(mock.reverse("CAT")).andReturn("TAC"); expect(mock.reverse(anyString())).andReturn("INVALID"); //PowerMock.replay() replay(mock); assertEquals("TAC", mock.reverse("CAT")); assertEquals("INVALID", mock.reverse("Java")); //PowerMock.verify() verify(mock); } }
Пример окончательного метода тестирования PowerMock EasyMock
Если вы хотите использовать TestNG вместо JUnit-4, убедитесь, что ваш тестовый класс расширяет PowerMockTestCase
класс. Также удалите аннотацию @RunWith
. Внесите необходимые изменения в другие аннотации и используйте методы утверждения TestNG.
Ниже класс использует тестирование вместе с PowerMock для моделирования конечных методов с помощью EasyMock.
package com.journaldev.easymock.powermock.finalmethod; 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; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.anyString; @PrepareForTest(Data1.class) public class TestNGPowerMockEasyMockFinalExample extends PowerMockTestCase{ @Test public void test_final_method_class() { //PowerMock.createMock() Data1 mock = createMock(Data1.class); expect(mock.reverse("CAT")).andReturn("TAC"); expect(mock.reverse(anyString())).andReturn("INVALID"); //PowerMock.replay() replay(mock); assertEquals("TAC", mock.reverse("CAT")); assertEquals("INVALID", mock.reverse("Java")); //PowerMock.verify() verify(mock); } } final class Data1 { final String reverse(String s) { return new StringBuffer(s).reverse().toString(); } }
Резюме
PowerMock – отличное расширение для фреймворков EasyMock и Mockito. Это помогает нам расширить наши тестовые примеры, чтобы охватить также конечные классы и конечные методы.