我一直在为Mockito发生的事情摸不着头脑 .

我有这个名为 ExamineFilter 的类,到目前为止还没有参数化 . 150个测试与这个 class 和其他所有通过罚款 . 很多嘲笑 .

然后我改变了 ExamineFilter

public class ExamineFilter extends FilteringTokenFilter implements GettableSet<UniqueSequence> {

public class ExamineFilter<V extends UniqueSequenceInterface> extends FilteringTokenFilter implements GettableSet<V> {

现在,当我有一个 ExamineFilter 的 Spy ,然后去

spyExamineFilter.add( ... )

...这个方法 addnot called 但代码继续 . 而之前被称为 .

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

public boolean add( V element ){ ...

...每次在 Spy 上调用此方法时,它返回 false ...这似乎是模拟在这样的 boolean -returning方法被嘲笑时会做的事情 .

我还检查了这确实是发生了什么,如果不是使用 ExamineFilter<...> 的 Spy 而不是使用 ExamineFilter<...> 的 Spy 会发生什么:事实上, add 被称为正常 .

这个Mockito行为是否有已知的和有记录的解释?显然,我现在正在考虑使用变通方法重写一些现在已经变红的测试......

Addendum

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

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

......如果有任何传球的Mockito高级牧师这样做:上述任何一种情况都表明异常行为可能实际上需要提出Mockito团队的问题吗?