使用PowerMock来Mock静态函数

使用PowerMock来Mock静态函数

转载于:http://www.zhujiangroad.com/program/Java/13146.html

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

第一个注解是指定Runner

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

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

Java代码

      
      
      
      
  1. import java.io.IOException;     
  2.     
  3. public class SystemPropertyMockDemo {     
  4.     public String getSystemProperty() throws IOException {     
  5.         return System.getProperty("property");     
  6.     }     

Java代码

      
      
      
      
  1. import org.easymock.EasyMock;     
  2. import org.junit.Assert;     
  3. import org.junit.Test;     
  4. import org.junit.runner.RunWith;     
  5. import org.powermock.api.easymock.PowerMock;     
  6. import org.powermock.core.classloader.annotations.PrepareForTest;     
  7. import org.powermock.modules.junit4.PowerMockRunner;     
  8.     
  9.     
  10. @RunWith(PowerMockRunner.class)     
  11. @PrepareForTest({SystemPropertyMockDemo.class})     
  12. public class SystemPropertyMockDemoTest {     
  13.     @Test    
  14.     public void demoOfFinalSystemClassMocking() throws Exception {     
  15.         PowerMock.mockStatic(System.class);     
  16.       
  17.         EasyMock.expect(System.getProperty("property")).andReturn("my property");     
  18.       
  19.         PowerMock.replayAll();     
  20.       
  21.         Assert.assertEquals("my property",     
  22.                                   new SystemPropertyMockDemo().getSystemProperty());     
  23.       
  24.         PowerMock.verifyAll();     
  25.     }     
  26. }    

测试用例里面增加了PrepareForTest注解,表明要测试的类,里面包含静态方法的调用  。

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

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

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

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

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

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

Xml代码

      
      
      
      
  1. <dependency>    
  2.           <groupId>org.powermock</< span>groupId>    
  3.           <artifactId>powermock-module-junit4</< span>artifactId>    
  4.           <version>1.4.8</< span>version>    
  5.           <scope>test</< span>scope>    
  6.        </< span>dependency>    
  7.        <dependency>    
  8.           <groupId>org.powermock</< span>groupId>    
  9.           <artifactId>powermock-api-easymock</< span>artifactId>    
  10.           <version>1.4.8</< span>version>    
  11.           <scope>test</< span>scope>    
  12.        </< span>dependency>    

你可能感兴趣的:(使用PowerMock来Mock静态函数)