Mockito.when() 不工作

Mockito.when() not working

我正在尝试模拟对我的 类:

之一的受保护方法的调用
import com.couchbase.client.java.view.Stale; // an enum
import com.google.common.base.Optional;

public class MyClass {
  public List<String> myList(Optional<Integer> arg1, Optional<Stale> arg2) {
    ...
  }
}

模拟将通过以下方式完成:

// Providing types for any() does not change anything
Mockito.when(myClass.myList(Mockito.any(), Mockito.any()).thenReturn(new ArrayList());

每当执行上一行时,都会调用实际的 myList() 方法,并使用 arg1arg2 的空值。为什么要调用该方法?毕竟,我试图避免任何执行...

正如 Brice 提到的,如果您的 myList 方法是最终方法,那么 Java 将跳过虚拟方法分派并调用原始对象(不是您的模拟对象)。

如果您 监视 一个实际的 class,when 将调用实际对象作为存根的一部分是预期的行为:之后all,在表达式 when(foo.bar()) Java 中不知道 when 有什么特别之处,并假设它关心 return 值 ) foo.bar(),而不是调用本身。 (我在 my answer here 的 "Implementation details" 部分完成了存根过程。)

这种语法更适合间谍:

doReturn(new ArrayList()).when(myClass).myList(any(), any());

因为这个不同的 when 方法接收一个对象,Mockito 可以准备对象 在存根期间什么都不做 ,这避免了对您的任何虚假调用 myList方法。

虽然 Jeff 的回答没有显示解决我的问题的方法,但它为我指明了正确的方向。

将模拟行为更改为 doReturn... 后,我突然收到一条错误消息。此消息告诉我 myClass 不是一个有意义的模拟,因为您只能模拟(或存根?)模拟或间谍对象的方法。因此,正如 Jeff 的回答所表明的那样,并在 documentation of mockito 中进行了解释,我用

创建了 MyClass 的部分模拟
MyClass myClass = Mockito.spy(new MyClass());

有了这个部分模拟,Jeff 的方法模拟方法突然奏效了(我的仍然没有,因此应该避免)。

所以:谢谢你,杰夫!