繁体   English   中英

为什么要调用此Mockito.mock对象而不是被模拟?

[英]Why is this Mockito.mock object being called instead of being mocked?

我正在对我的类进行单元测试并遇到这种情况:我使用Mockito模拟一个对象并在该对象上调用一个方法。 当我这样做时,我希望不要调用真正的方法,并继续程序流程。 发生的事情是正在调用真正的方法并且我得到了一个N​​ullPointerException,因为如果我用这个参数调用该方法会发生这种情况。

不应该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:14objectOutputStream.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM