如何使用PowerMockito施放模拟对象



我的方法是以下行 -

ObjectMapper objectMapper = new ObjectMapper(); //1
JsonNode root = objectMapper.readTree(details); //2
((ObjectNode) root).put("userId", userId); //3

我试图为上述第3行编写一个存根,并且通过说ClassCastException -

来失败。
@Mock
JsonNode                mockJsonNode;
@Mock
ObjectNode              mockObjectNode;
ObjectMapper mockMapper = PowerMockito.mock(ObjectMapper.class);
PowerMockito.whenNew(ObjectMapper.class).withNoArguments().thenReturn(mockMapper);
PowerMockito.when(mockMapper.readTree(Matchers.anyString())).thenReturn(mockJsonNode);
PowerMockito.when(mockObjectNode.put(Mockito.anyString(), Mockito.anyString())).thenReturn(mockObjectNode);

我理解是它的例外,因为模拟对象和实际对象之间没有关系,但是编写第3行的存根的方法是什么?

这是完整的例外 -

java.lang.ClassCastException: com.fasterxml.jackson.databind.JsonNode$$EnhancerByMockitoWithCGLIB$$26691c0b cannot be cast to com.fasterxml.jackson.databind.node.ObjectNode

您声明

JsonNode                mockJsonNode;

因此,您的模拟框架将确保MockJsonNode是该类型 JSONNODE的"恰好"。

请记住:A cast 无非是告诉编译器"他,您,您认为您认为具有类型y的对象X,实际上它具有Z型Z"。为了进行这项工作,X实际上必须是运行时的Z。

因此,简单的解决方案可能是将声明更改为:

ObjectNode mockJsonNode

换句话说:您的生产代码假设 readTree()返回的结果实际上是 objectnode 的实例。然后,当然,您必须确保您的模拟框架实际上返回 objectnode 的东西。

相关内容

  • 没有找到相关文章

最新更新