gpt4 book ai didi

java - 为什么 Mockito ArgumentCaptor 颠覆泛型

转载 作者:太空宇宙 更新时间:2023-11-04 09:57:55 24 4
gpt4 key购买 nike

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,包含实例 A 和实例 B。

这是为什么呢?是否因为在运行时,instanceA 和 instanceB 参数在传递给 someClass 时变成了 Object,并且 Mockito 没有根据 ArgumentCaptor 的类型正确类型检查 Object?

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

最佳答案

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

Note that an ArgumentCaptor don't do any type checks, it is only there to avoid casting in your code. This might however change (type checks could be added) in a future major release.

如果您想实现一些参数区分,您可以尝试利用 Answer

关于java - 为什么 Mockito ArgumentCaptor 颠覆泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53868480/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com