使用PowerMockito 对静态类进行mock
Mock的中文的意思就是模拟,Mockito是mock的扩展,但是Mockito并不支持对静态类的mock,所以我们引入PowerMockito实现对静态类的mock.
首先pom添加PowerMockito 的 jar包引用,注意相应的版本号。否则会出现jar包冲突异常。
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <version>1.10.8</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito</artifactId> <version>1.6.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>1.6.1</version> <scope>test</scope> </dependency> dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
如例我们需要对LogUtil.class 的 静态方法进行mock,类格式如下,该类的两个方法均为静态方法。
public class LogUtil { public static BaseAuditLog getLogBean(String operContent){ return null; } public static void saveLog(String context){ }
使用PowerMockito 测试类如下 :
@RunWith(PowerMockRunner.class) //1. @PrepareForTest({LogUtil.class}) //2. public class AddressBookServiceTest_mock { @Before public void setUp() { MockitoAnnotations.initMocks(this); } @Test public void test_staticMethod_PowerMock() { //绕过静态类 PowerMockito.mockStatic(LogUtil.class);//3.绕过静态类 when(LogUtil.getLogBean(json)).thenReturn(new SensitiveInfoOperationLog());//4.预设静态类返回值
String response = addressBookServiceImpl.queryAddressBookFuzzy(json); } }
以上便可以实现的静态类的mock.
因为要实现单元测试,还需要实现对类成员变量进行mock.
有两种主要方法
1.通过继承方式实现
2.通过反射的方式实现
详细信息参考链接 http://blog.csdn.net/fenglibing/article/details/16842655
反射具体示例如下:
public class Address{ boolean querySwitch= false } public class Address_test{ private Address address; public void test_Address(){ //通过反射改变类成员变量值 boolean querySwitch=false; Field field=address.getClass().getDeclaredField("querySwitch"); field.setAccessible(true); field.set(address,querySwitch); } }