如何使用PowerMockito强制转换模拟对象

时间:2016-11-30 15:02:38

标签: java mockito 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

1 个答案:

答案 0 :(得分:2)

你宣布了

JsonNode                mockJsonNode;

因此,您的模拟框架将确保mockJsonNode“完全”类型 JsonNode

请记住:强制转换只不过是告诉编译器“他,你编译器,你认为对象X有Y型,实际上它有Z型”。为了实现这一目标,X实际上必须在运行时为Z.

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

ObjectNode mockJsonNode

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