PowerMock模拟对象

PowerMock是一个开源Java框架, 用于在单元测试中创建模拟对象。它扩展了其他模拟框架, 例如EasyMock和Mockito, 以增强功能。 PowerMock框架使用自定义的类加载器和字节码操作技术来模拟静态方法, 最终类, 最终方法, 私有方法, 构造函数以及删除静态初始化程序。 PowerMock的主要目的是通过一些方法和注释来扩展现有的API, 以提供使单元测试非常容易的额外功能。
PowerMock框架提供了一个称为PowerMockito的类, 该类用于创建模拟对象并启动验证和期望。 PowerMockito提供了与Java反射API一起使用的功能。
让我们借助示例来了解PowerMock的概念。
带Mockito的PowerMock示例
在这里, 我们将创建一个带有Mockito和JUnit框架的PowerMock示例。要使用PowerMock创建示例, 我们需要完成以下步骤。
步骤1:在pom.xml文件中添加以下PowerMock依赖项。

< dependency> < groupId> org.powermock< /groupId> < artifactId> powermock-api-mockito< /artifactId> < version> 1.7.0< /version> < scope> test< /scope> < /dependency> < dependency> < groupId> org.powermock< /groupId> < artifactId> powermock-module-junit4< /artifactId> < version> 1.7.0< /version> < scope> test< /scope> < /dependency>

步骤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创建的所有示例, 以上两个步骤是必需的。 以下是带有Mockito和JUnit框架的PowerMock的示例。
1.模拟静态方法
在下面的示例中, 我们将模拟静态方法。
步骤1:创建一个包含静态方法的类。我们创建了一个名为Utility的类。
Utility.java
public class Utility {public static String staticMethod(String call) {return call; } }

步骤2:创建一个名为Powermock_test的JUnit测试用例, 以进行测试。
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); } }

输出如下
以下输出显示测试已成功运行。
PowerMock模拟对象

文章图片
我们还可以通过使用PowerMockito的verifyStatic()方法来验证是否调用了静态方法, 如下所示。
PowerMockito.verifyStatic(); Utility.staticMethod(call);

2.模拟私有方法
在下面的示例中, 我们将创建私有方法的模拟。
步骤1:创建一个包含私有方法的类。我们已经创建了名为Utility的类, 并定义了一个私有方法和一个公共方法(返回私有方法的对象)。
Utility.java
public class Utility { private String privateMethod(String message) {return message; }public String callPrivateMethod(String message) {return privateMethod(message); } }

步骤2:创建一个名为PowerMock_test的JUnit测试用例以进行测试。
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 {@Testpublic 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())); } }

输出如下
以下输出显示测试已成功运行。
PowerMock模拟对象

文章图片
3.模拟最终方法
在下面的示例中, 我们将模拟final方法。
步骤1:创建一个包含final方法的类。我们创建了一个名为Utility的类, 并定义了一个名为finalMethod的最终方法。
Utility.java
public class Utility { public final String finalMethod(String message) {return message; } }

步骤2:创建一个名为Powermock_test的JUnit测试用例以进行测试。
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); } }

输出如下
【PowerMock模拟对象】以下输出显示测试已成功运行。
PowerMock模拟对象

文章图片

    推荐阅读