zoukankan      html  css  js  c++  java
  • 使用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);
        }
      
    }    

      

  • 相关阅读:
    BF算法和KMP算法
    Python课程笔记 (五)
    0268. Missing Number (E)
    0009. Palindrome Number (E)
    0008. String to Integer (atoi) (M)
    0213. House Robber II (M)
    0198. House Robber (E)
    0187. Repeated DNA Sequences (M)
    0007. Reverse Integer (E)
    0006. ZigZag Conversion (M)
  • 原文地址:https://www.cnblogs.com/lianshan/p/6930771.html
Copyright © 2011-2022 走看看