java when thenreturn_doReturn().when()与when().thenReturn()

在昨天的汇报中,潘老师觉得讲的偏离了中心,在讲解了一番了以后,让我重新修改,但我觉得那篇文章若要改成这个题目,改动颇大,所以有了这篇文章。

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。

看到这想必也明白了所谓的副作用,若是执行里面的方法时,难免会产生影响,比如抛出异常等。


版权声明:本文为weixin_34900470原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。