PowerMock és un marc Java de codi obert utilitzat per crear un objecte simulat en proves unitàries. Amplia altres marcs de burla com EasyMock i Mockito per millorar les capacitats. El marc PowerMock utilitza un carregador de classes personalitzat i tècniques de manipulació de bytecode per permetre la burla dels mètodes estàtics, les classes finals, els mètodes finals, els mètodes privats, el constructor i l'eliminació d'inicialitzadors estàtics. L'objectiu principal de PowerMock és ampliar les API existents amb alguns mètodes i anotacions per proporcionar funcions addicionals que facin que les proves d'unitats siguin bastant fàcils.
El framework PowerMock proporciona una classe anomenada PowerMockito s'utilitza per crear objectes simulats i inicia la verificació i l'expectativa. El PowerMockito proporciona la funcionalitat per treballar amb l'API de reflexió de Java.
Entendrem el concepte de PowerMock amb l'ajuda d'un exemple.
Exemple de PowerMock amb Mockito
Aquí, crearem un exemple de PowerMock amb marcs Mockito i JUnit. Per crear un exemple amb PowerMock, hem de seguir els passos següents.
Pas 1: Afegiu les dependències PowerMock següents al fitxer pom.xml.
org.powermock powermock-api-mockito 1.7.0 test org.powermock powermock-module-junit4 1.7.0 test
Pas 2: Apliqueu les anotacions de PowerMock
Per utilitzar PowerMock amb Mockito, hem d'aplicar el següent dos anotacions a la prova:
@RunWith(PowerMockRunner.class): És el mateix que hem utilitzat en els nostres exemples anteriors. L'única diferència és que a l'exemple anterior hem utilitzat MockitoUnitRunner.class, ara utilitzarem PowerMockRunner.class per habilitar les API de PowerMockito a la prova.
@PrepareForTest: Li diu a PowerMock que prepari algunes classes per a la prova. Es pot aplicar tant a les classes de prova com als mètodes de prova individuals. Inclou classes amb mètodes finals, estàtics, privats o natius que es poden burlar.
@RunWith(PowerMockRunner.class) @PrepareForTest(Utility.class) public class Powermock_test { }
Nota: els dos passos anteriors són obligatoris per a tots els exemples que crearem amb PowerMock.
Hi ha exemples següents de PowerMock amb marcs Mockito i JUnit.
1. Burla estàtica mètodes
En l'exemple següent, ens burlarem estàtica mètodes.
Pas 1: Crea una classe que contingui a estàtica mètode. Hem creat una classe amb el nom Utilitat.
Utility.java
public class Utility { public static String staticMethod(String call) { return call; } }
Pas 2: Creeu un cas de prova JUnit, anomenat Powermock_test, amb finalitats de prova.
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); } }
Sortida
La sortida següent mostra que la prova s'està executant correctament.
rj12 vs rj11
També podem comprovar que el mètode estàtic s'anomena o no, utilitzant el verificar estàtic() mètode de PowerMockito, tal com es mostra a continuació.
PowerMockito.verifyStatic(); Utility.staticMethod(call);
2. Burla privat mètodes
En l'exemple següent, en crearem una simulació privat mètodes.
Pas 1: Creeu una classe que contingui un mètode privat. Hem creat una classe amb el nom Utilitat i va definir a privat mètode i un mètode públic (que retorna l'objecte del mètode privat).
Utility.java
public class Utility { private String privateMethod(String message) { return message; } public String callPrivateMethod(String message) { return privateMethod(message); } }
Pas 2: Creeu un cas de prova JUnit anomenat PowerMock_test amb finalitats de prova.
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())); } }
Sortida
La sortida següent mostra que la prova s'està executant correctament.
3. Burla final mètodes
En l'exemple següent, ens burlarem final mètodes.
Pas 1: Crea una classe que contingui a final mètode. Hem creat una classe amb el nom Utility i hem definit un mètode final anomenat finalMethod.
Utility.java
public class Utility { public final String finalMethod(String message) { return message; } }
Pas 2: Creeu un cas de prova JUnit anomenat Powermock_test amb finalitats de prova.
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); } }
Sortida
La sortida següent mostra que la prova s'està executant correctament.