java如何模拟方法调用而不实际调用其子方法
我从昨天开始使用JUnits(Mockito)。我搜索了类似的问题,但没有找到
我有一个方法为method1()
的类,该方法反过来调用method2()
我不想嘲笑method2
我正在模拟对method1()
的调用。我希望它会返回我想要的自定义对象(不需要继续调用method2
)。但是它继续并尝试调用method2()
class A {
method1() {
//do something.
method2();
}
}
我模仿method1并返回任何对象(比如^{
我不想别人打电话给我。但是当我调试这个Junit时。它去调用method2
。因此失败了
# 1 楼答案
当使用这样的语法时:
然后,Java将要做的第一件事是计算
when(mockA.method1())
,这需要调用mockA.method1()
来获得要传递到when
的值。对于其他mock,您不会注意到这一点,因为Mockito mock返回很好的默认值,但是对于spies和CALLS_REAL_METHODS
mock,这是一个更大的问题。显然,这种语法不起作用相反,请使用以
do
开头的方法:作为
.when(mockA)
的一部分,Mockito将返回一个没有行为的实例,因此对method1()
的调用永远不会在真实实例上发生do
语法也适用于void方法,这使得它比when(...).thenReturn(...)
语法更灵活。一些开发者主张一直使用doReturn
;我更喜欢thenReturn
,因为它更容易阅读,还可以为您进行返回类型检查顺便说一句,除非你绝对需要一个全新的实例,否则最好选择
Integer.valueOf(1)
而不是new Integer(1)
。Java保留了一个小整数的缓存,如果需要手动将int
放入Integer
中,这可能比分配一个全新的引用更快# 2 楼答案
通常,您模拟接口或抽象类,并提供抽象方法的实现。在您的例子中,您希望替换一个具体类的实际实现。这可以通过部分模拟来实现
http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#16