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



我在使用captors测试同一方法的两个单独调用时遇到问题,但参数类型不同。

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

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)等工作相同吗?

目前我正在获得 TooManyActualIncalls - 2 而不是 1。

我们如何处理此类案件?我不喜欢使用一个俘虏然后投射结果的想法。

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

import static org.mockito.AdditionalMatchers.and;
// ...
verify(myClient).doSomething(and(isA(Foo.class), fooCaptor));
verify(myClient).doSomething(and(isA(Bar.class), barCaptor));

相关内容

  • 没有找到相关文章

最新更新