2016-11-30 66 views
1

我的方法蒙上了模拟对象是有以下行 -如何使用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 

回答

2

你宣布

JsonNode    mockJsonNode; 

所以,你的模拟框架将确保mockJsonNode是该类型JsonNode的 “准确”。

请记住:一个转换没有别的,只是告诉编译器“他,你编译器,对象X,你认为是Y型,实际上它有类型Z”。为了做到这一点,X实际上在运行时必须是Z.

所以,简单的解决方案可能是该声明更改为:

ObjectNode mockJsonNode 

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

+0

哦,它的工作......你节省了我的时间。谢谢。 – Saurabh

+0

非常欢迎您! – GhostCat

相关问题