PowerMock е Java рамка с отворен код, използвана за създаване на макет на обект при тестване на единици. Той разширява други подигравателни рамки като EasyMock и Mockito, за да подобри възможностите. Рамката PowerMock използва персонализирано средство за зареждане на класове и техники за манипулиране на байт код, за да даде възможност за подиграване на статични методи, финални класове, финални методи, частни методи, конструктор и премахване на статични инициализатори. Основната цел на PowerMock е да разшири съществуващите API с някои методи и анотации, за да предостави допълнителни функции, които правят тестването на единици доста лесно.
Рамката PowerMock предоставя клас, наречен PowerMockito използва се за създаване на фалшиви обекти и инициира проверка и очакване. PowerMockito предоставя функционалността за работа с API за отразяване на Java.
Нека разберем концепцията на PowerMock с помощта на пример.
частичен производен символ латекс
Пример за PowerMock с Mockito
Тук ще създадем пример за PowerMock с рамки Mockito и JUnit. За да създадем пример с помощта на PowerMock, трябва да преминем през следните стъпки.
Етап 1: Добавете следните зависимости на PowerMock във файла pom.xml.
org.powermock powermock-api-mockito 1.7.0 test org.powermock powermock-module-junit4 1.7.0 test
Стъпка 2: Приложете анотациите на PowerMock
За да използваме PowerMock с Mockito, трябва да приложим следното две анотации в теста:
@RunWith(PowerMockRunner.class): Това е същото, което използвахме в нашите предишни примери. Единствената разлика е, че в предишния пример използвахме MockitoUnitRunner.class, сега ще използваме PowerMockRunner.class за активиране на PowerMockito API в теста.
@PrepareForTest: Той казва на PowerMock да подготви някои класове за тестване. Може да се прилага както за тестовите класове, така и за отделните методи за тестване. Той включва класове с final, static, private или native методи, които могат да бъдат имитирани.
@RunWith(PowerMockRunner.class) @PrepareForTest(Utility.class) public class Powermock_test { }
Забележка: Горните две стъпки са задължителни за всички примери, които ще създадем с помощта на PowerMock.
Има следните примери за PowerMock с рамки Mockito и JUnit.
1. Подигравка статичен методи
В следващия пример ще се подиграваме статичен методи.
Етап 1: Създайте клас, който съдържа a статичен метод. Създадохме клас с името полезност.
Utility.java
public class Utility { public static String staticMethod(String call) { return call; } }
Стъпка 2: Създайте JUnit тестов случай с име Powermock_test, с цел тестване.
основни въпроси за интервю за java
Powermock_test.java
import static junit.framework.Assert.assertEquals; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(Utility.class) public class Powermock_test { @Test public void TestStaticMethod_WithPowerMockito() { String call = ' Hi there, I'm using PowerMock with Mockito '; String callexpectation = ' Call Expectation for you. '; PowerMockito.mockStatic(Utility.class); PowerMockito.when(Utility.staticMethod(call)).thenReturn(callexpectation); String actualcall = Utility.staticMethod(call); assertEquals(callexpectation, actualcall); } }
Изход
Следният резултат показва, че тестът се изпълнява успешно.
Можем също да проверим дали статичният метод е извикан или не, като използваме verifyStatic() метод на PowerMockito, както е показано по-долу.
PowerMockito.verifyStatic(); Utility.staticMethod(call);
2. Подигравка частен методи
В следващия пример ще създадем макет на частен методи.
Етап 1: Създайте клас, който съдържа частен метод. Създадохме клас с името полезност и дефиниран a частен метод и публичен метод (който връща обекта на частния метод).
Utility.java
public class Utility { private String privateMethod(String message) { return message; } public String callPrivateMethod(String message) { return privateMethod(message); } }
Стъпка 2: Създайте JUnit тестов случай с име PowerMock_test с цел тестване.
Powermock_test.java
import static junit.framework.Assert.assertEquals; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(Utility.class) public class Powermock_test { @Test public void TestPrivateMethod_WithPowerMock() throws Exception { String message = ' PowerMock with Mockito and JUnit '; String expectedmessage = ' Using with EasyMock '; Utility mock =PowerMockito.spy(new Utility()); PowerMockito.doReturn(expectedmessage).when(mock, 'privateMethod', message); String actualmessage = mock.callPrivateMethod(message); assertEquals(expectedmessage, actualmessage); System.out.println(PowerMockito.verifyPrivate(getClass())); } }
Изход
Следният резултат показва, че тестът се изпълнява успешно.
3. Подигравка финал методи
В следващия пример ще се подиграваме финал методи.
Етап 1: Създайте клас, който съдържа a финал метод. Създадохме клас с името Utility и дефинирахме окончателен метод с име finalMethod.
как да се инжектира макет абстрактен клас
Utility.java
public class Utility { public final String finalMethod(String message) { return message; } }
Стъпка 2: Създайте JUnit тестов случай с име Powermock_test за тестови цели.
Powermock_test.java
import static junit.framework.Assert.assertEquals; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(Utility.class) public class Powermock_test { @Test public void TestFinalMethod_WithPowerMock() throws Exception { String message = ' PowerMock with Mockito and JUnit '; Utility uti = PowerMockito.mock(Utility.class); PowerMockito.whenNew(Utility.class).withNoArguments().thenReturn(uti); Utility uti2 = new Utility(); PowerMockito.verifyNew(Utility.class).withNoArguments(); PowerMockito.when(uti2.finalMethod(message)).thenReturn(message); String message2 = uti2.finalMethod(message); Mockito.verify(uti2).finalMethod(message); assertEquals(message, message2); } }
Изход
Следният резултат показва, че тестът се изпълнява успешно.