2012-10-06 26 views
4

在下面的例子when()如何工作?

when(myMethod("abc", 123)).thenReturn(456); 

怎样的when()方法捕捉方法名和参数,而不实际调用myMethod()

我可以写一个方法来执行与when()相同的操作,以便我得到一个方法指针和一个Object s的数组作为参数以供以后调用吗?

回答

2

方法myMethod被调用。但它正在被模拟对象调用 - 这是“诀窍”。当然,你可以编写接受“方法指针”(在Java中,它将是类Method的对象)和一些参数,并使用invoke的代码,但这样做实际上并不会为你购买任何东西而不是调用直接模拟对象的myMethod

更经常可以看到when称为如下:

MyObject myObject = mock(MyObject.class); 
when(myObject.myMethod("abc", 123)).thenReturn(456); 

尝试打印(或记录)的表达

myObject.getClass().getName() 

在这里。你会看到模拟对象的类实际上不是MyObject。但它是一个具有相同接口的类。这个对象的调用更新了一些内部状态。这允许Mockito跟踪它的使用方式,并允许你断言各种事情。

+0

是的,我知道如何手动调用它。但我希望有一个更干净的方式做到这一点... –

+0

啊,我明白了。不过,哪一部分看起来并不干净?可能还有其他方法可以设置一个模拟场景来表明当传递“abc”和123时方法返回456 - 你想要什么样的语法? –

0

在上例中,myMethod是模拟对象上的一种方法。没有任何预期,Mockito将返回null,0或false,具体取决于数据类型,其中when将默默丢弃。

但是,您也可以在不是模拟对象的对象上使用when,而是使用Mockito.spy()创建的对象。在这种情况下,该方法实际上将在when方法中调用,这通常不是您想要执行的操作。的Mockito提供了一个称为另一种方法doReturn(或可能doAnswerdoThrow),它为您提供置换对象使原来没有被调用(docs):

doReturn(1).when(mySpiedObject).getSomeInteger(anyString(), eq("seven")); 

。注意的Mockito文档建议使用when而不是doReturn因为后者是not type-safe

+0

重新您的最后一段。 Mockito文档说的是什么?我认为这一点已经从联机文档中删除。 –

+0

@David看起来'when'仍然是首选,原因是最近移到了doReturn方法文档:没有返回值类型检查'doReturn'调用。 –

相关问题