我正在尝试模拟对我的某个类的受保护方法的调用:
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
方法。为什么这个方法被调用了?毕竟,我试图避免任何执行......
答案 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的方法模拟方法突然起作用(我的方法仍然没有,因此应该避免)。
所以:谢谢你,杰夫!