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

      

  • 相关阅读:
    mount: can't find cdrom in /etc /fstab or /etc/mtab
    Crontab 的使用方法
    遍历文件夹下的所有文件
    Python将PDF转为TXT
    软件下载链接地址
    在机器上连接数据库
    正则表达式
    python实现给字典添加条目的方法
    urllib2连接超时设置
    数据结构(二)链表
  • 原文地址:https://www.cnblogs.com/lianshan/p/6930771.html
Copyright © 2011-2022 走看看