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.powermock< span>groupId>
- <artifactId>powermock-module-junit4< span>artifactId>
- <version>1.4.8< span>version>
- <scope>test< span>scope>
- < span>dependency>
- <dependency>
- <groupId>org.powermock< span>groupId>
- <artifactId>powermock-api-easymock< span>artifactId>
- <version>1.4.8< span>version>
- <scope>test< span>scope>
- < span>dependency>
【编辑推荐】