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

新手上路,请多包涵

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

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

原文由 Andreas Köberle 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 594
2 个回答

使用 @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()));
    }
}

原文由 crunchdog 发布,翻译遵循 CC BY-SA 4.0 许可协议

是的,这是一个普遍的泛型问题,而不是 mockito 特有的。

没有 ArrayList<SomeType> 的类对象,因此您不能类型安全地将此类对象传递给需要 Class<ArrayList<SomeType>> 的方法。

您可以将对象转换为正确的类型:

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

这将给出一些关于不安全转换的警告,当然你的 ArgumentCaptor 不能真正区分 ArrayList<SomeType>ArrayList<AnotherType> 可能不检查元素。

(正如在另一个答案中提到的,虽然这是一个一般的泛型问题,但对于带有 @Captor 注释的类型安全问题有一个 Mockito 特定的解决方案。它仍然无法区分 ArrayList<SomeType> 和一个 ArrayList<OtherType> 。)

编辑:

也看看 tenshi 的评论。您可以将原始代码更改为此简化版本:

 final ArgumentCaptor<List<SomeType>> listCaptor
        = ArgumentCaptor.forClass((Class) List.class);

原文由 Paŭlo Ebermann 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题