如何使用 mockito 捕获特定类型的列表

2022-08-31 04:49:26

有没有办法使用mojitos ArgumentCaptore捕获特定类型的列表。这不起作用:

ArgumentCaptor<ArrayList<SomeType>> argument = ArgumentCaptor.forClass(ArrayList.class);

答案 1

嵌套泛型问题可以通过@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()));
    }
}

答案 2

是的,这是一个通用的问题,而不是特定于模拟的。

没有 的类对象,因此您无法安全地将此类对象传递给需要 .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);

推荐