我的方法有以下行 -
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
答案 0 :(得分:2)
你宣布了
JsonNode mockJsonNode;
因此,您的模拟框架将确保mockJsonNode“完全”类型 JsonNode 。
请记住:强制转换只不过是告诉编译器“他,你编译器,你认为对象X有Y型,实际上它有Z型”。为了实现这一目标,X实际上必须在运行时为Z.
因此,简单的解决方案可能是将声明更改为:
ObjectNode mockJsonNode
换句话说:您的生产代码假设 readTree()
返回的结果实际上是 ObjectNode 的实例。然后,当然你必须确保你的模拟框架实际上返回一个 ObjectNode 的东西。