java - 如何在一种测试方法中使用两种不同的参数捕获器?
问题描述
我在使用捕获器测试同一方法的两个单独调用时遇到问题,但参数类型不同。
我提供了我在这里尝试做的代码示例 - 基本上我想验证某个方法是否被调用了两次,但使用两个单独的捕获器使用不同的类型参数,然后在捕获的对象上调用一些断言。
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)
etc 一样工作吗?
目前我得到 TooManyActualInvocations - 2 而不是 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));
推荐阅读
- flutter - 当我使用 'flutter_barcode_scanner: ^1.0.1' 时 Flutter 'Error running pod install'
- python - python flask - api调用在部署的应用程序中不起作用
- extjs - Extjs Treeview:如何删除节点之间的虚线
- python - 如何在不破坏python循环的情况下执行条件
- sqlite - SQlite C API 导致应用程序分段错误
- java - 使用reactor逐行读取文本文件
- r - GGPLOT2:以有序字符变量为 x 轴的 geom_area
- vagrant - PuPHPet 网站去哪儿了?
- docker - /var/www/html 的目录索引被禁止
- angular - “请求的内容不存在。” Angular 静态网站 (Azure) 出现 404 错误