【问题标题】:Why does Mockito ArgumentCaptor subvert generics为什么 Mockito ArgumentCaptor 会颠覆泛型
【发布时间】:2018-12-20 12:12:37
【问题描述】:

Mockito ArgumentCaptor 似乎颠覆了泛型,如以下伪代码所示。

public Class SomeClass{
   public void someMethod(Object msg){
       // do whatever
   }
} 

执行单元测试,其中传递了 SomeClass 的模拟。 在模拟上进行以下方法调用。

someClass.someMethod(instanceA)
someClass.someMethod(instanceB) // where A & B are different classes

单元测试然后执行以下操作 >

ArgumentCaptor<A> argumentCaptorA = ArgumentCaptor.forClass(A.class);
ArgumentCaptor<B> argumentCaptorB = ArgumentCaptor.forClass(B.class);

Mockito.verify(someClass, times(2)).someMethod(argumentCaptorA.capture());
Mockito.verify(someClass, times(2)).someMethod(argumentCaptorB.capture());

问题来了>

List<A> listA = argumentCaptorA.getAllValues(); 
List<B> listB = argumentCaptorB.getAllValues(); 

listA 和 listB 的大小均为 2,同时包含 instanceA 和 instanceB。

这是为什么?是因为在运行时 instanceA 和 instanceB 参数在传递给 someClass 时变为 Object 并且 Mockito 没有针对 ArgumentCaptors 的类型正确地检查 Object 吗?

我预计泛型将确保 listA 将包含 instanceA 而 listB 将包含 instanceB。

【问题讨论】:

标签: java unit-testing generics mockito


【解决方案1】:

根据 javadoc,不支持您的预期但可能会更改(2.21.0 版本):

注意 ArgumentCaptor 不做任何类型检查,它只是 那里以避免在您的代码中进行强制转换。然而,这可能会改变(类型 检查可以添加)在未来的主要版本中。

如果你想实现一些参数的差异化,你可以尝试利用Answer

【讨论】:

    猜你喜欢
    • 2023-02-15
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 2011-05-25
    • 2010-09-23
    • 2013-10-02
    • 2023-02-06
    • 2017-03-20
    相关资源
    最近更新 更多