如何使用 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 的解决方案。它仍然无法区分 和 .)@CaptorArrayList<SomeType>ArrayList<OtherType>
也看看Tenshi的评论。您可以将原始代码更改为以下简化版本:
final ArgumentCaptor<List<SomeType>> listCaptor
        = ArgumentCaptor.forClass((Class) List.class);