使用PowerMock来Mock静态函数

本文介绍如何使用PowerMock框架来mock static, final及private方法,并通过一个具体示例展示其使用过程。PowerMock通过操纵字节码的方式实现了对这些通常难以mock的方法的支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EasyMock和Mockito等框架,对static, final, private方法均是不能mock的。 这些框架普遍是通过创建Proxy的方式来实现的mock。 而PowerMock是使用CGLib来操纵字节码而实现的mock,所以它能实现对上面方法的mock。今天先来看一个简单的例子吧:

第一个注解是指定Runner

第二个是你要测试的类,这个里面调用了静态类

下面我结合EasyMock给一个简单的例子:

Java代码

import java.io.IOException;

public class SystemPropertyMockDemo {
public String getSystemProperty() throws IOException {
return System.getProperty("property");
}
}
Java代码

import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;


@RunWith(PowerMockRunner.class)
@PrepareForTest({SystemPropertyMockDemo.class})
public class SystemPropertyMockDemoTest {
@Test
public void demoOfFinalSystemClassMocking() throws Exception {
PowerMock.mockStatic(System.class);

EasyMock.expect(System.getProperty("property")).andReturn("my property");

PowerMock.replayAll();

Assert.assertEquals("my property",
new SystemPropertyMockDemo().getSystemProperty());

PowerMock.verifyAll();
}
}
测试用例里面增加了PrepareForTest注解,表明要测试的类,里面包含静态方法的调用。

然后在测试类里面指定要测试的静态类和它的方法。

实际上PowerMock是在EasyMock上面做了扩展,这些写法都是和EasyMock相同的。

今天先写这么一个简单的例子,然后以后会将用到的都写上来。

当然了,更多的可以参考:

http://code.google.com/p/powermock/

另外它的maven依赖如下,我在使用的时候就弄错了

Xml代码

<dependency>
<groupId>org.powermockgroupId>
<artifactId>powermock-module-junit4artifactId>
<version>1.4.8version>
<scope>testscope>
dependency>
<dependency>
<groupId>org.powermockgroupId>
<artifactId>powermock-api-easymockartifactId>
<version>1.4.8version>
<scope>testscope>
dependency>

06:00-10:00销售当天第一期,10:00统一开奖。10:00-22:00(10分钟一期,共72期),22:00-02:00(5分钟一期,共48期),02:00-06:00暂停销售,全天共计120期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值