Java when()如何工作?
在下面的示例中Java when()如何工作?,java,mocking,mockito,Java,Mocking,Mockito,在下面的示例中 when(myMethod("abc", 123)).thenReturn(456); when()方法如何捕获方法名和参数而不实际调用myMethod() 我可以编写一个方法来执行与when()相同的操作吗?这样我可以得到一个方法指针和一个对象数组作为参数,以便以后调用?方法myMethod被调用。但它是在模拟对象上调用的——这就是“技巧” 当然,您可以编写接受“方法指针”(在Java中,它将是类method的对象)和一些参数的代码,并使用invoke,但这样做实际上并不比直
when(myMethod("abc", 123)).thenReturn(456);
when()
方法如何捕获方法名和参数而不实际调用myMethod()
我可以编写一个方法来执行与when()相同的操作吗?这样我可以得到一个方法指针和一个
对象数组作为参数,以便以后调用?方法myMethod
被调用。但它是在模拟对象上调用的——这就是“技巧”
当然,您可以编写接受“方法指针”(在Java中,它将是类method
的对象)和一些参数的代码,并使用invoke
,但这样做实际上并不比直接调用模拟对象的myMethod
更划算
当调用
时,更常见的是看到如下所示的:
MyObject myObject = mock(MyObject.class);
when(myObject.myMethod("abc", 123)).thenReturn(456);
尝试打印(或记录)表达式
myObject.getClass().getName()
在这里。您将看到模拟对象的类实际上不是MyObject
。但它属于具有相同接口的类。对该对象的调用会更新某些内部状态。这允许Mockito跟踪它的使用方式,并允许您声明各种内容。在上面的示例中,myMethod
是模拟对象上的一种方法。如果没有任何预期,Mockito将根据数据类型返回null
、0或false,而将在时自动放弃
但是,如果对象不是模拟对象,而是使用Mockito.spy()
创建的对象,则也可以在该对象上使用。在这种情况下,方法实际上会在when
方法中调用,这通常不是您想要做的。Mockito提供了另一个名为doReturn
(或者可能是doAnswer
或doThrow
)的方法,该方法为您提供了一个替换对象,因此不会调用原始对象():
请注意,Mockito文档建议在
时使用,而不是doReturn
,因为后者是。是的,我知道如何手动调用它。但我希望有一种更干净的方法…啊,我明白了。但是,哪一部分看起来不干净?可能还有其他方法来设置模拟场景,说明当传递“abc”和123时,方法返回456——你在考虑什么样的语法?这是你的最后一段。Mockito文档是怎么说的?我原以为在线文档中已经删除了该位。@David似乎还是首选,而时仍然是首选,原因是最近被移到了doReturn
方法文档中:在doReturn
调用中没有返回值类型检查。
doReturn(1).when(mySpiedObject).getSomeInteger(anyString(), eq("seven"));