PowerMock é uma estrutura Java de código aberto usada para criar um objeto simulado em testes de unidade. Ele estende outras estruturas de simulação, como EasyMock e Mockito, para aprimorar os recursos. A estrutura PowerMock usa um carregador de classe personalizado e técnicas de manipulação de bytecode para permitir a simulação de métodos estáticos, classes finais, métodos finais, métodos privados, construtor e remoção de inicializadores estáticos. O principal objetivo do PowerMock é estender as APIs existentes com alguns métodos e anotações para fornecer recursos extras que tornam o teste de unidade bastante fácil.
A estrutura PowerMock fornece uma classe chamada PowerMockito usado para criar objetos simulados e inicia verificação e expectativa. O PowerMockito fornece a funcionalidade para trabalhar com a API de reflexão Java.
Vamos entender o conceito do PowerMock com a ajuda de um exemplo.
Exemplo de PowerMock com Mockito
Aqui, vamos criar um exemplo de PowerMock com frameworks Mockito e JUnit. Para criar um exemplo usando PowerMock, precisamos seguir as etapas a seguir.
Passo 1: Adicione as seguintes dependências do PowerMock no arquivo pom.xml.
org.powermock powermock-api-mockito 1.7.0 test org.powermock powermock-module-junit4 1.7.0 test
Passo 2: Aplicar as anotações do PowerMock
Para usar PowerMock com Mockito, precisamos aplicar o seguinte dois anotações no teste:
@RunWith(PowerMockRunner.class): É o mesmo que usamos em nossos exemplos anteriores. A única diferença é que no exemplo anterior utilizamos MockitoUnitRunner.class, agora usaremos PowerMockRunner.class para habilitar as APIs PowerMockito no teste.
@PrepareForTest: Diz ao PowerMock para preparar algumas classes para teste. Ele pode ser aplicado tanto às classes de teste quanto aos métodos de teste individuais. Inclui classes com métodos finais, estáticos, privados ou nativos que podem ser ridicularizados.
@RunWith(PowerMockRunner.class) @PrepareForTest(Utility.class) public class Powermock_test { }
Nota: As duas etapas acima são obrigatórias para todos os exemplos que iremos criar usando PowerMock.
Existem os seguintes exemplos de PowerMock com estruturas Mockito e JUnit.
1. Zombando estático métodos
No exemplo a seguir, vamos zombar estático métodos.
Passo 1: Crie uma classe que contenha um estático método. Criamos uma classe com o nome Utilitário.
Utilitário.java
public class Utility { public static String staticMethod(String call) { return call; } }
Passo 2: Crie um caso de teste JUnit, chamado Powermock_teste, para fins de teste.
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); } }
Saída
A saída a seguir mostra que o teste está sendo executado com êxito.
Também podemos verificar se o método estático é chamado ou não, usando o método verificarStatic() método do PowerMockito, conforme mostrado abaixo.
PowerMockito.verifyStatic(); Utility.staticMethod(call);
2. Zombando privado métodos
No exemplo a seguir, criaremos uma simulação de privado métodos.
Passo 1: Crie uma classe que contenha um método privado. Criamos uma classe com o nome Utilitário e definiu um privado método e um método público (que retorna o objeto do método privado).
Utilitário.java
public class Utility { private String privateMethod(String message) { return message; } public String callPrivateMethod(String message) { return privateMethod(message); } }
Passo 2: Crie um caso de teste JUnit chamado PowerMock_test para fins de teste.
android pode jogar gamepigeon
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())); } }
Saída
A saída a seguir mostra que o teste está sendo executado com êxito.
3. Zombando final métodos
No exemplo a seguir, vamos zombar final métodos.
Passo 1: Crie uma classe que contenha um final método. Criamos uma classe com o nome Utility e definimos um método final chamado método final.
Utilitário.java
public class Utility { public final String finalMethod(String message) { return message; } }
Passo 2: Crie um caso de teste JUnit chamado Powermock_test para fins de teste.
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); } }
Saída
A saída a seguir mostra que o teste está sendo executado com êxito.