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

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM