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