将参数传递给功能接口的ArgumentCaptor

时间:2017-02-11 01:30:24

标签: java mocking mockito

我有一个界面

MyFunctionalInterface<T> {
   T execute(SomeClass var)
}

我还有一个我嘲笑的对象叫做方法

myObject.myMethod(var -> someOtherMethod(var, arg))

我通过陈述

来嘲笑这个对象
ArgumentCaptor<MyFunctionalInterface> functionalInterfaceCaptor;
...
when(myMockObject.myMethod(functionalInterfaceCaptor.capture())).then(doSomething)

我想从arg获取functionalInterfaceCaptor的值。我知道它存储了这个值,因为当我进入Intellij调试器并单击functionalInterfaceCaptor时,我可以查看私有字段capturingMatcher,然后查看字段arguments,这是包含var值和arg值的链接列表。但是,我无法弄清楚我需要在functionalInterfaceCaptor上调用哪些方法才能在我的测试中看到这些(ArgumentCaptor不会暴露任何方法)。如何获得arg的价值?

2 个答案:

答案 0 :(得分:2)

当您致电myObject.myMethod(var -> someOtherMethod(var, arg))时,方法的参数是lambda var -> someOtherMethod(var, arg)。因此,functionalInterfaceCaptor捕获lambda本身,而不是它所调用的参数。

如果要捕获arg,则必须模拟已定义的对象someOtherMethod并为此方法设置ArgumentCaptor

答案 1 :(得分:0)

也许使用ArgumentMatcher

when(myMockObject.myMethod(new ArgumentMatcher(functionalInterfaceCaptor))。then(doSomething)