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()
方法,并使用 arg1
和 arg2
的空值。为什么要调用该方法?毕竟,我试图避免任何执行...
正如 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 的方法模拟方法突然奏效了(我的仍然没有,因此应该避免)。
所以:谢谢你,杰夫!
我正在尝试模拟对我的 类:
之一的受保护方法的调用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
的空值。为什么要调用该方法?毕竟,我试图避免任何执行...
正如 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 的方法模拟方法突然奏效了(我的仍然没有,因此应该避免)。
所以:谢谢你,杰夫!