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