Java Mockito-参数化类的间谍调用mock方法

Java Mockito-参数化类的间谍调用mock方法,java,mocking,mockito,spy,parameterization,Java,Mocking,Mockito,Spy,Parameterization,我一直在为刚刚发生在莫基托身上的事情挠头 我有一个类,叫做ExamineFilter,到目前为止还没有被参数化。150多个与本课程相关的测试以及其他所有通过的测试都是罚款。很多嘲弄 然后,我将检查过滤器从 public class ExamineFilter extends FilteringTokenFilter implements GettableSet<UniqueSequence> { 。。。此方法add未调用,但代码将继续执行。而它以前叫过 这里的add方法实际上来自S

我一直在为刚刚发生在莫基托身上的事情挠头

我有一个类,叫做
ExamineFilter
,到目前为止还没有被参数化。150多个与本课程相关的测试以及其他所有通过的测试都是罚款。很多嘲弄

然后,我将
检查过滤器

public class ExamineFilter extends FilteringTokenFilter implements GettableSet<UniqueSequence> {
。。。此方法
add
未调用,但代码将继续执行。而它以前叫过

这里的
add
方法实际上来自
Set
,因为
GettableSet
扩展了
Set
,并且
Set.add
的签名是

public boolean add( V element ){ ...
。。。每次对spy调用此方法时,它都返回
false
。。。这似乎是一个mock会做的,如果这样一个
布尔返回方法被mock

我还检查了这确实是正在发生的事情,通过找出如果我使用真正的
testefilter
而不是使用
testefilter
的间谍,会发生什么:并且,实际上,
add
被称为正常

对于这种莫基托行为是否有一个已知的和记录在案的解释?显然,我现在正试图想出一些变通办法来重写少数几个测试,结果这些测试都变成了红色

附录

顺便说一下,对于任何感兴趣的人,我尝试了“callRealMethod”的两种“味道”:


。。。如果有路过的Mockito大祭司是这样来的:上述任何一项是否暗示了异常行为,这可能会导致向Mockito团队提出问题?

您可能需要添加注释
@Override
,以查看该方法是否真的覆盖了基本方法,否则您的IDE会给您一个提示,您可以向我们展示
GettableSet
的类定义吗?Tx.Yep@Override标记就在那里。我花了一个小时试图弄清楚add的“目标”是否与我的想法不同!GettableSet是一个接口。你可以从我的答案中找到答案:
spyExamineFilter.add( ... ) 
public boolean add( V element ){ ...
    doCallRealMethod().when( spyExamineFilter ).add( any() ); // results in immediate call (i.e. at this line!) with null argument to add()
    when( spyExamineFilter.add( any())).thenCallRealMethod(); // results in mock "add" call when add() invoked
    when( spyExamineFilter.add( any( UniqueSequence.class ))).thenCallRealMethod(); // results in mock "add" call when add() invoked
    when( spyExamineFilter.add( notNull() )).thenCallRealMethod(); // results in mock "add" call when add() invoked