我的方法有以下几行-

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;


因此,您的模拟框架将确保模拟JsonNode与JsonNode类型“完全相同”。

注意:强制转换只是告诉编译器“他,您的编译器,您认为对象X具有类型Y,实际上它具有类型Z”。为了使该工作有效,X在运行时实际上必须是Z。

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

ObjectNode mockJsonNode


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

关于java - 如何使用PowerMockito转换模拟对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40891607/

10-12 05:54