Mockito 存根错误的方法

Mockito stubs wrong method

我正在尝试存根模拟 JsonNode 对象的 "isObject" 方法。该方法 returns 一个布尔值。它在内部调用 "getNodeType" 方法,其中 returns 一个 JsonNodeType,并根据 JsonNodeType.OBJECT 检查该值。程序编译,然后在运行时抛出一个异常,说我试图用布尔值存根 getNodeType,即使代码试图存根 isObject。

我的问题是:为什么 mockito 试图存根不同于代码中指定的方法?我如何让 mockito 存根正确的方法?

据我所知,我已将问题隔离为最基本的要素。以下代码在以 "when(":

开头的行抛出异常
import static org.mockito.Mockito.*;
import com.fasterxml.jackson.databind.JsonNode;

public class Toy {

    public static void main(String[] args) {
        JsonNode testNode = mock(JsonNode.class);
        when(testNode.isObject()).thenReturn(true);
    }
}

异常信息是这样的:

Exception in thread "main" org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
Boolean cannot be returned by getNodeType()
getNodeType() should return JsonNodeType

If you're unsure why you're getting above error read on.
Due to the nature of the syntax above problem might occur because:

1. This exception *might* occur in wrongly written multi-threaded tests.
   Please refer to Mockito FAQ on limitations of concurrency testing.
2. A spy is stubbed using when(spy.foo()).then() syntax. It is safer to stub spies with doReturn|Throw() family of methods. More in javadocs for Mockito.spy() method.

供参考,这里是jackson代码中"isObject"方法的实现:

public final boolean isObject() {
    return getNodeType() == JsonNodeType.OBJECT;
}

我正在使用 Jackson 2.3.3 和 Mockito 1.10.19。我完全被这段代码的行为搞糊涂了。非常感谢任何帮助。

您不能使用 Mockito 模拟 final 方法。但是你可以使用 PowerMockito。看看this answer.