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);
} }
输出如下
以下输出显示测试已成功运行。
文章图片
我们还可以通过使用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()));
} }
输出如下
以下输出显示测试已成功运行。
文章图片
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模拟对象】以下输出显示测试已成功运行。
文章图片
推荐阅读
- Mockito监视或模拟抽象类
- Mockito与EasyMock有什么区别()
- Hamcrest Matchers介绍和用法
- 行为驱动开发(BDD)
- 参数捕获器(ArgumentCaptor)
- Mockito参数匹配器
- 读取 Android 设备内核日志的方法
- etherlime-3-Etherlime Library API-Deployed Contract Wrapper
- sonarqube扫描安卓代码