[英]Why is this Mockito.mock object being called instead of being mocked?
我正在对我的类进行单元测试并遇到这种情况:我使用Mockito模拟一个对象并在该对象上调用一个方法。 当我这样做时,我希望不要调用真正的方法,并继续程序流程。 发生的事情是正在调用真正的方法并且我得到了一个NullPointerException,因为如果我用这个参数调用该方法会发生这种情况。
不应该Mockito.mock阻止这种行为?
Mockito文档说By default, for all methods that return value, mock returns null, an empty collection or appropriate primitive/primitive wrapper value (eg: 0, false, ... for int/Integer, boolean/Boolean, ...).
并且这个答案证实了我的预期行为。 In a mock all methods are stubbed and return "smart return types". This means that calling any method on a mocked class will do nothing unless you specify behaviour.
In a mock all methods are stubbed and return "smart return types". This means that calling any method on a mocked class will do nothing unless you specify behaviour.
编码:
public class BrokenTest {
@Test
public void shouldPassBecauseItIsMocked() throws IOException {
Object anyObject = Mockito.mock(Object.class);
ObjectOutputStream objectOutputStream = Mockito.mock(ObjectOutputStream.class);
objectOutputStream.writeObject(anyObject);
}
}
我期望这个测试通过,但我得到一个NullPointerException:
java.lang.NullPointerException
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1108)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at packageName.BrokenTest.shouldPassBecauseItIsMocked(BrokenTest.java:14)
...
( BrokenTest.java:14
是objectOutputStream.writeObject(anyObject);
实际上是行)
PS:我并没有真正尝试测试ObjectOutputStream
而是使用ObjectOutputStream.writeObject(Object object)
的我的类。 当我执行myObjectWithMockedObjectOutputStream.methodThatCallsWriteObject()
时,问题确实出现了
Mockito并没有改变语言的运作方式。 方法按照它们在代码中的顺序调用。 这意味着在这样的模拟方法的情况下:
when(mockObject.getSomething()).thenReturn(SOMETHING_ELSE);
首先在getSomething()
对象上调用getSomething()
,然后mockito的基础结构替换返回值,然后控制您的测试代码。
这意味着如果getSomething()
调用getSomething()
对象的某些依赖项,则后者不会被初始化并导致NPE。
解决此问题的方法是使用配置模拟的其他形式:
doReturn(SOMETHING_ELSE).when(mockObject ) .getSomething();
请不就是结束花when
移离方法后面前.
。
这允许Mokito拦截完整的方法调用,以便不抛出NPE。
JBNizet在问题评论中正确回答。
writeObject是最终的。 Mockito(直到最近的版本,如果你专门配置它这样做)不能模拟最终方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.