如何使用 PowerMockito 投射模拟对象
How to cast a mock object using 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$691c0b cannot be cast to com.fasterxml.jackson.databind.node.ObjectNode
你声明了
JsonNode mockJsonNode;
因此您的模拟框架将确保 mockJsonNode 是 "exactly" 那种类型的 JsonNode。
请记住:cast 只是告诉编译器 "he, you compiler, that object X that you think has type Y, in reality it has type Z"。为了使其工作,X 在运行时实际上必须是 Z。
因此,简单的解决方案可能是将该声明更改为:
ObjectNode mockJsonNode
换句话说:您的生产代码假设 readTree()
返回的结果实际上是ObjectNode 的一个实例。然后,当然你必须确保你的模拟框架实际上 returns 是一个 ObjectNode。
我的方法有以下行 -
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$691c0b cannot be cast to com.fasterxml.jackson.databind.node.ObjectNode
你声明了
JsonNode mockJsonNode;
因此您的模拟框架将确保 mockJsonNode 是 "exactly" 那种类型的 JsonNode。
请记住:cast 只是告诉编译器 "he, you compiler, that object X that you think has type Y, in reality it has type Z"。为了使其工作,X 在运行时实际上必须是 Z。
因此,简单的解决方案可能是将该声明更改为:
ObjectNode mockJsonNode
换句话说:您的生产代码假设 readTree()
返回的结果实际上是ObjectNode 的一个实例。然后,当然你必须确保你的模拟框架实际上 returns 是一个 ObjectNode。