Mockito.when()不工作

时间:2015-04-13 14:20:08

标签: mockito guava

我正在尝试模拟对我的某个类的受保护方法的调用:

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()arg1的空值调用实际的arg2方法。为什么这个方法被调用了?毕竟,我试图避免任何执行......

2 个答案:

答案 0 :(得分:3)

正如Brice所提到的,如果你的myList方法是最终的,那么Java会跳过虚拟方法调度并调用原始对象(而不是你的模拟)。

如果您在实际的类中监视,那么when将会将实际对象作为存根的一部分进行预期行为:毕竟,在表达式{{1}中Java对when(foo.bar())并不知道任何特别之处,并假设它关心when返回值),而不是调用本身。 (我在my answer here的“实施细节”部分中介绍了存根过程。)

这种语法更适合间谍:

foo.bar()

因为这个不同的doReturn(new ArrayList()).when(myClass).myList(any(), any()); 方法会收到一个对象,所以Mockito可以准备对象在存根期间不做任何事情,这可以避免对when方法进行任何虚假调用。< / p>

答案 1 :(得分:0)

尽管Jeff的回答没有显示我的问题的解决方法,但它指出了我正确的方向。

将模拟行为更改为doReturn...后,我突然收到错误消息。这条消息告诉我,myClass不是一个有意义的模拟,因为你只能模拟(或存根?)模拟或间谍对象的方法。因此,当Jeff的回答表明并在documentation of mockito中解释时,我创建了MyClass的部分模拟

MyClass myClass = Mockito.spy(new MyClass());

通过这种局部模拟Jeff的方法模拟方法突然起作用(我的方法仍然没有,因此应该避免)。

所以:谢谢你,杰夫!