2016-11-30 55 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

相關問題