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

      

  • 相关阅读:
    export、export default 和 exports、module.exports 的区别
    RunJS JavaScript及时运行调试工具
    vuecli 中的devServer配置代理
    vue使用pinyin的npm包将文字转为大写首字母
    vue阻止事件冒泡和默认事件
    解决Elementu的 elform 使用 vif校验失灵问题
    calc()使用方法
    element ui 中的 resetFields() 报错'resetFields' of undefined
    vux中的 scroller 组件,在iOS13上,一停止滑动就跳到顶部问题
    elementui的input加单位符号
  • 原文地址:https://www.cnblogs.com/lianshan/p/6930771.html
Copyright © 2020-2023  润新知