如何使用 mockito 捕获特定类型的列表
2022-08-31 04:49:26
有没有办法使用mojitos ArgumentCaptore捕获特定类型的列表。这不起作用:
ArgumentCaptor<ArrayList<SomeType>> argument = ArgumentCaptor.forClass(ArrayList.class);
有没有办法使用mojitos ArgumentCaptore捕获特定类型的列表。这不起作用:
ArgumentCaptor<ArrayList<SomeType>> argument = ArgumentCaptor.forClass(ArrayList.class);
嵌套泛型问题可以通过@Captor注释来避免:
public class Test{
@Mock
private Service service;
@Captor
private ArgumentCaptor<ArrayList<SomeType>> captor;
@Before
public void init(){
MockitoAnnotations.initMocks(this);
}
@Test
public void shouldDoStuffWithListValues() {
//...
verify(service).doStuff(captor.capture()));
}
}
是的,这是一个通用的问题,而不是特定于模拟的。
没有 的类对象,因此您无法安全地将此类对象传递给需要 .ArrayList<SomeType>
Class<ArrayList<SomeType>>
您可以将对象强制转换为正确的类型:
Class<ArrayList<SomeType>> listClass =
(Class<ArrayList<SomeType>>)(Class)ArrayList.class;
ArgumentCaptor<ArrayList<SomeType>> argument = ArgumentCaptor.forClass(listClass);
这将给出一些关于不安全转换的警告,当然,你的ArspaceCaptor无法真正区分和不检查元素。ArrayList<SomeType>
ArrayList<AnotherType>
(如另一个答案所述,虽然这是一个通用泛型问题,但对于注释的类型安全问题,有一个特定于 Mockito 的解决方案。它仍然无法区分 和 .)@Captor
ArrayList<SomeType>
ArrayList<OtherType>
也看看Tenshi的评论。您可以将原始代码更改为以下简化版本:
final ArgumentCaptor<List<SomeType>> listCaptor
= ArgumentCaptor.forClass((Class) List.class);