【问题标题】:How does when() work?when() 是如何工作的?
【发布时间】:2012-10-13 05:36:54
【问题描述】:

在下面的例子中

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

when() 方法如何在不实际调用 myMethod() 的情况下捕获方法名称和参数?

我可以编写一个方法来做与when() 相同的事情,以便获得一个方法指针和一个Objects 数组作为稍后调用的参数吗?

【问题讨论】:

    标签: java mocking mockito


    【解决方案1】:

    方法myMethod调用。但它是在模拟对象上调用的——这就是“技巧”。

    当然,您可以编写接受“方法指针”(在 Java 中,它将是类 Method 的对象)和一些参数的代码,并使用 invoke,但这样做实际上并没有给您带来任何好处直接调用模拟对象的myMethod

    when 更常见的调用方式如下:

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

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

    myObject.getClass().getName()
    

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

    【讨论】:

    • 是的,我知道如何手动调用它。但我希望有一种更清洁的方法......
    • 啊,我明白了。但是,哪个部分看起来不干净?可能还有其他方法可以设置一个模拟场景,以说明该方法在传递“abc”和 123 时返回 456 - 您在考虑哪种语法?
    【解决方案2】:

    在你上面的例子中,myMethod 是一个模拟对象的方法。没有任何期望,Mockito 将根据数据类型返回 null、0 或 false,when 将静默丢弃。

    但是,您也可以在不是模拟对象而是使用Mockito.spy() 创建的对象上使用when。在这种情况下,该方法实际上会在 when 方法中调用,这通常不是您想要做的。 Mockito 提供了另一种称为doReturn(或者可能是doAnswerdoThrow)的方法,它为您提供了一个替换对象,因此永远不会调用原始对象(docs):

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

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

    【讨论】:

    • 是你的最后一段。什么 Mockito 文档是这么说的?我认为这部分内容已从在线文档中删除。
    • @David 似乎when 仍然是首选,原因是最近移至doReturn 方法文档:doReturn 调用没有返回值类型检查。跨度>
    猜你喜欢
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 2013-08-20
    • 2017-07-24
    • 2016-11-13
    相关资源
    最近更新 更多