PowerMock è un framework Java open source utilizzato per creare un oggetto fittizio negli unit test. Estende altri framework beffardi come EasyMock e Mockito per migliorare le capacità. Il framework PowerMock utilizza un caricatore di classi personalizzato e tecniche di manipolazione del bytecode per consentire la simulazione di metodi statici, classi finali, metodi finali, metodi privati, costruttore e rimozione di inizializzatori statici. Lo scopo principale di PowerMock è estendere le API esistenti con alcuni metodi e annotazioni per fornire funzionalità extra che rendano i test unitari abbastanza semplici.
Il framework PowerMock fornisce una classe chiamata PowerMockito utilizzato per creare oggetti finti e avvia la verifica e l'aspettativa. PowerMockito fornisce la funzionalità per lavorare con l'API di riflessione Java.
Comprendiamo il concetto di PowerMock con l'aiuto di un esempio.
tupla ordinata in Python
Esempio di PowerMock con Mockito
Qui creeremo un esempio di PowerMock con i framework Mockito e JUnit. Per creare un esempio utilizzando PowerMock, dobbiamo seguire i seguenti passaggi.
Passo 1: Aggiungi le seguenti dipendenze PowerMock nel file pom.xml.
org.powermock powermock-api-mockito 1.7.0 test org.powermock powermock-module-junit4 1.7.0 test
Passo 2: Applicare le annotazioni PowerMock
Per utilizzare PowerMock con Mockito, dobbiamo applicare quanto segue due annotazioni nel test:
@RunWith(PowerMockRunner.class): È lo stesso che abbiamo usato nei nostri esempi precedenti. L'unica differenza è che nell'esempio precedente abbiamo utilizzato MockitoUnitRunner.class, ora utilizzeremo PowerMockRunner.class per abilitare le API PowerMockito nel test.
@PrepareForTest: Dice a PowerMock di preparare alcune classi per il test. Può essere applicato sia alle classi di prova che ai singoli metodi di prova. Include classi con metodi finali, statici, privati o nativi che possono essere derisi.
@RunWith(PowerMockRunner.class) @PrepareForTest(Utility.class) public class Powermock_test { }
Nota: i due passaggi precedenti sono obbligatori per tutti gli esempi che creeremo utilizzando PowerMock.
Di seguito sono riportati esempi di PowerMock con framework Mockito e JUnit.
1. Beffardo statico metodi
Nell'esempio seguente, prenderemo in giro statico metodi.
Passo 1: Crea una classe che contenga a statico metodo. Abbiamo creato una classe con il nome Utilità.
Utilità.java
public class Utility { public static String staticMethod(String call) { return call; } }
Passo 2: Crea un test case JUnit, denominato Powermock_test, a scopo di test.
classe astratta 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); } }
Produzione
L'output seguente mostra che il test è in esecuzione con successo.
Possiamo anche verificare che il metodo statico venga chiamato o meno, utilizzando il metodo verificaStatico() metodo di PowerMockito, come mostrato di seguito.
PowerMockito.verifyStatic(); Utility.staticMethod(call);
2. Beffardo privato metodi
Nell'esempio seguente, creeremo un mock of privato metodi.
Passo 1: Crea una classe che contiene un metodo privato. Abbiamo creato una classe con il nome Utilità e definito a privato metodo e un metodo pubblico (che restituisce l'oggetto del metodo privato).
Utilità.java
public class Utility { private String privateMethod(String message) { return message; } public String callPrivateMethod(String message) { return privateMethod(message); } }
Passo 2: Crea un test case JUnit denominato PowerMock_test a scopo di 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())); } }
Produzione
L'output seguente mostra che il test è in esecuzione con successo.
3. Beffardo finale metodi
Nell'esempio seguente, prenderemo in giro finale metodi.
Passo 1: Crea una classe che contenga a finale metodo. Abbiamo creato una classe con il nome Utility e definito un metodo finale denominato metodo finale.
ordina l'array java
Utilità.java
public class Utility { public final String finalMethod(String message) { return message; } }
Passo 2: Crea un test case JUnit denominato Powermock_test a scopo di 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); } }
Produzione
L'output seguente mostra che il test è in esecuzione con successo.