Mock的中文的意思就是模擬,Mockito是mock的擴展,可是Mockito並不支持對靜態類的mock,因此咱們引入PowerMockito實現對靜態類的mock.java
首先pom添加PowerMockito 的 jar包引用,注意相應的版本號。不然會出現jar包衝突異常。json
<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,類格式以下,該類的兩個方法均爲靜態方法。api
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.this
有兩種主要方法spa
1.經過繼承方式實現.net
2.經過反射的方式實現code
詳細信息參考連接 http://blog.csdn.net/fenglibing/article/details/16842655blog
反射具體示例以下:
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); } }