个性化阅读
专注于IT技术分析

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);
	}
 }

输出如下

以下输出显示测试已成功运行。

带Mockito的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 {

    @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()));
     }
 }

输出如下

以下输出显示测试已成功运行。

带Mockito的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);
	}
 }

输出如下

以下输出显示测试已成功运行。

带Mockito的PowerMock示例

赞(0)
未经允许不得转载:srcmini » PowerMock模拟对象

评论 抢沙发

评论前必须登录!