在昨天的汇报中,潘老师觉得讲的偏离了中心,在讲解了一番了以后,让我重新修改,但我觉得那篇文章若要改成这个题目,改动颇大,所以有了这篇文章。
mock()与spy()
想要使用题目中的方法,必须得是一个mock的对象,而这可以通过上面两种方法生成,先来看看他两的区别:
有一个类A
class A {
public int add(int a , int b) {
return a + b;
}
}
此时生成两个对象
A a = new A();
A a1 = Mockito.mock(A.class);
A a2 = mockito.spy(a);
此时,通过mock生成的对象,会拥有以前的对象的所有方法,但是方法中都没有了功能,就比如上面的a1
对应的类可以理解下面这样
A1 extend A {
pubic int add(int a, int b) {
return null;
}
}
而a2
是同过调用clone()复制的,正常看来就和一个普通的对象一模一样,只是他的方法能够进行模拟。
两种模拟方法
doReturn().when()是无副作用的。
when().thenReturn()是有副作用的
上面是比较官方的说法,用实际的例子来理解一下,
Mockito.when(a2.add(1,2 )).thenReturn(5);
此时上面的方法中,会先执行a + b
,即 1 + 2
, 结果本应是3,但由于后面的thenReturn
,所以调用该方法时,实际的返回值是5。
而若是用另一种方法
Mockito.doReturn(5).when(a2).add(1,2);
此时,就不会执行a+b
的操作,而会直接返回5。
看到这想必也明白了所谓的副作用,若是执行里面的方法时,难免会产生影响,比如抛出异常等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。