如何在一种测试方法中使用两种不同的参数捕获器?

时间:2019-01-25 15:02:27

标签: java mockito

我在使用捕获程序来测试两个相同方法但参数类型不同的单独调用时遇到问题。

我提供了我要在此处执行的操作的代码示例-基本上,我想验证是否两次调用了某些方法,但是使用两个单独的捕获器使用了不同类型的参数,然后对捕获的对象调用了一些断言。

public class Foo {
}

public class Bar {
}

public interface MyClient {
  void doSomething(Object obj);
}

public class MyService {
    private MyClient client;

    void doSomething() {
        client.doSomething(new Foo());
        client.doSomething(new Bar());
    }
}

@RunWith(MockitoJUnitRunner.class)
public class MyServiceTest {

    @InjectMocks
    private MyService testObj;

    @Mock
    private MyClient myClient;

    @Captor
    private ArgumentCaptor<Foo> fooCaptor;

    @Captor
    private ArgumentCaptor<Bar> barCaptor;

    @Test
    public void testSomething() {
        testObj.doSomething();

        verify(myClient).doSomething(fooCaptor.capture());
        // ...do something with fooCaptor

        verify(myClient).doSomething(barCaptor.capture());
        // ...do something with barCaptor
    }
}

我希望此测试能够按原样通过,因为绑架者指定了参数类型,所以这不应该与ArgumentMatchers.any(Foo.class)等相同吗?

目前,我收到的是TooManyActualInvocations-2而不是1。

我们如何处理此类案件?我不喜欢使用一个捕获器然后转换结果的想法。

1 个答案:

答案 0 :(得分:1)

尝试使用isA软件包中的and运算符将捕获者与AdditionalMatchers匹配器组合在一起。

import static org.mockito.AdditionalMatchers.and;

// ...

verify(myClient).doSomething(and(isA(Foo.class), fooCaptor));
verify(myClient).doSomething(and(isA(Bar.class), barCaptor));