zoukankan      html  css  js  c++  java
  • 使用Mockito对类成员变量进行Mock


    Mock的中文的意思就是模拟,Mockito是一个模拟对象框架,主要还是用于单元测试中,它通过隐藏真实的实现来返回我们期望的结果,这样我们就可以排除其它可能对当前单元的执行结果产生影响的其它因素,如我们的某个功能需要调用一个远程接口,但是这个时候我们只需要关心当前功能是否能够正常工作而不需要关心远程接口是否正常工作,我们就可以通过模拟远程接口返回的正确或者错误值进行测试。
    这是两篇关于Mockito可以快速入门的文章:

    http://blog.csdn.net/onlyqi/article/details/6396646
    http://blog.csdn.net/onlyqi/article/details/6546589

    这其中介绍了Mockito的基本使用方式,以及可供参的例子,对初次接触的Mockito的人来说,算是不错的入门文档。
    下面是Mockito本身的Javadoc中带的实例,只不过是全英文的,和上面提到的两篇文章有异曲同工之处,只不过会介绍得更加介绍一些,有兴趣的话可以看看:

    http://mockito.googlecode.com/svn/branches/1.6/javadoc/org/mockito/Mockito.html

    在实际的操作过程当中,我们经常会对类成员的变量进行Mock,特别是对第三文类库中类的类成员变量进行Mock,这个时候我们不能够去修改第三方库的源代码,我们这个时候可以有两种方式来达这个目的:
    1、通过使用继续的方式
    不过这种方式会受限于被Mock的类成员变量的变量定义范围,只有public及protected的才可以使用这种方式,如以下是一个第三方库的一个类:

    public class OneClass{
    	protected TestA testA;
    	//......
    }
    
    

    我们这个时候可以在Mock的测试类中使用一个类来继承这个类,然后把变量通过子类的super调用传给父类:

    private class OneClassChild extends OneClass{
    		public OneClassChild(TestA testA){
    			super.testA = testA;
    		}
    	}
    
    

    我们的Mock代码就可以写成这样了:
    @Test
    public void testMock(){
    	TestA testA = new TestA();
    	OneClass oneClass = new OneClassChild(testA);
    	//假设需要调用方法callOneClassMethod,Return根据实际情况进行返回了
    	when(oneClass.callOneClassMethod()).thenReturn(0);
    	//......
     
    }

    这样就达到Mock了OneClass中的类成员变量testA的目的,用我们需要的返回结果,替代了真实的返回结果。

    2、通过使用反射的方式
    如这个时候第三方类库中的类的成员变量为私有的:

    public class OneClass{
    	private TestA testA;
    	//......
    }
    
    

    这个时候通过反射的方式将这个类中的成员变量给替换掉,这个时候的Mock代码就会如下:
    @Test
    public void testMock(){
    	TestA testA = new TestA();
    	OneClass oneClass = new OneClass();
      Field testAField = oneClass.getClass().getDeclaredField("testA");
    	testAField.setAccessible(true);
    	testAField.set(oneClass, testA);
    	//假设需要调用方法callOneClassMethod,Return根据实际情况进行返回了
    	when(oneClass.callOneClassMethod()).thenReturn(0);
    	//......
     
    }

    比较上面的两种方式,还是第二种比较通用,不会受到变量的可见性的影响。

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

  • 相关阅读:
    【知乎精选】一个产品经理的成长(转)
    互联网性能与容量评估的方法论和典型案例
    系统吞吐量(TPS)、用户并发量、性能测试概念和公式
    基于Windows运行库的UWP—C#高级编程(第10版)学习笔记3
    .Net Core的重要性(价值)—C#高级编程(第10版)学习笔记2
    本书主要内容—C#高级编程(第10版)学习笔记1
    C#—.net开发首选编程语言—摘自《C#高级编程第10版》
    表格标签
    伪类
    ps小知识点备忘录
  • 原文地址:https://www.cnblogs.com/skiwdhwhssh/p/10340744.html
Copyright © 2011-2022 走看看