Mockito 的 Argument Captor 行为

Bog*_*ros 5 java mockito

我面临的问题是我需要跟踪某些方法的调用,但只能使用指定的参数参数。请参阅下面的问题

@Test
public void simpleTest() {
    ArgumentCaptor<Pear> captor = ArgumentCaptor.forClass(Pear.class);
    Action action = mock(Action.class);
    action.perform(new Pear());
    action.perform(new Apple());
    verify(action, times(1)).perform(captor.capture());
}

static class Action {

    public void perform(IFruit fruit) {}

}
static class Pear implements IFruit {}
static class Apple implements IFruit {}

interface IFruit {}
Run Code Online (Sandbox Code Playgroud)

但是得到:

org.mockito.exceptions.verification.TooManyActualInvocations: 
action.perform(<Capturing argument>);
Wanted 1 time:
But was 2 times. Undesired invocation:
..
Run Code Online (Sandbox Code Playgroud)

我做错了什么?Mockito v 1.10

老实说,这只是举例,我的代码更复杂,我不知道,Apple.class 会调用多少次执行。对我来说没关系。我只需要验证 perform(Pear.class) 的调用

UPD: 我需要验证 Pear.class 的方法是否被调用过一次。让我们想象一下,Action 是 Transaction,而 perform 是 save(DomainObject)。所以我需要确保 save(MyDomainObject) 被调用一次,但不管之前保存了多少个对象。此操作对于测试来说是原子的,我无法在这些操作之间重置模拟

Arn*_*aud 4

要验证带有实例参数的调用次数Pear,您可以使用:

verify(action, times(1)).perform(isA(Pear.class));
Run Code Online (Sandbox Code Playgroud)

比照。莫基托。验证方法参数是特定的类

请注意,从 Mockito 2.1 开始,以下内容也可以工作:

verify(action, times(1)).perform(any(Pear.class));
Run Code Online (Sandbox Code Playgroud)

参见 公共静态T任何(类类型)

...这是一个别名:isA(Class)...

...自mockito 2.1.0 起,any() 和anyObject() 不再是此方法的别名。