Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java when()如何工作?_Java_Mocking_Mockito - Fatal编程技术网

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"));