使用Mockito对类成员变量进行Mock

时间:2022-04-04 02:37:23

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

}

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