2012-10-22 98 views
2

我需要模擬這樣的:
使用mockito嘲笑鏈式方法調用?

void handleCellPreview(CellPreviewEvent<List<String>> event) { 
    Element cellElement = event.getNativeEvent().getEventTarget().cast(); 
} 

我這樣做:

CellPreviewEvent<List<String>> cellPreviewEvent = Mockito.mock(
     CellPreviewEvent.class, Mockito.RETURNS_DEEP_STUBS); 
Element cellElement = Mockito.mock(Element.class, Mockito.RETURNS_DEEP_STUBS); 
EventTarget eventTarget = Mockito.mock(EventTarget.class); 
    Mockito.when(cellPreviewEvent.getNativeEvent().getEventTarget().cast()).thenReturn(cellElement); 


而且我收到以下錯誤:

testHandleCellPreview(client.view.MyViewTest)java.lang.NullPointerException 
    at com.google.gwt.dom.client.NativeEvent.getEventTarget(NativeEvent.java:137) 
    atclient.view.MyViewTest.testHandleCellPreview(MyViewTest.java:76) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 


我也見過,山姆e question question:
mock or stub for chained call

有誰能指出我缺少的東西嗎?

感謝,
莫希特

+0

什麼是'testHandleCellPreview'的76行?您使用的是哪個版本的GWT? –

+3

**不要模擬你不擁有的類型**這是一件壞事,例如:如果外部類型改變行爲,你將不會在你的測試中看到它,如果外部類型被重構或者你必須重寫所有的測試。您應該寫一個反腐敗層(或者包裝或橋樑),您只能使用集成測試進行測試。此外上面的代碼表明,你打破**德米特法**,你應該改爲**告訴,不要問**原則。希望這會有所幫助:) – Brice

+0

@John行#76是對我的方法(測試中)的調用。我正在使用GWT 2.5 – EMM

回答

-1

您需要在父實體重新設置嘲笑的對象。所以在運行時,它使用模擬對象。

cellPreviewEvent.setCellElement(cellElement); 
cellPreviewEvent.setEventTarget(eventTarget); 

完整代碼如下所示:

CellPreviewEvent<List<String>> cellPreviewEvent = Mockito.mock(
     CellPreviewEvent.class, Mockito.RETURNS_DEEP_STUBS); 
Element cellElement = Mockito.mock(Element.class, Mockito.RETURNS_DEEP_STUBS); 
EventTarget eventTarget = Mockito.mock(EventTarget.class); 
cellPreviewEvent.setCellElement(cellElement); 
cellPreviewEvent.setEventTarget(eventTarget); 
    Mockito.when(cellPreviewEvent.getNativeEvent().getEventTarget().cast()).thenReturn(cellElement); 
+0

我不加細胞對我的DataGrid(GWT)。我沒有使用自定義單元格。 :( – EMM

+0

這些方法未定義cellPreviewEvent。要了解更多信息,請參見此處:http://google-web-toolkit.googlecode.com/svn/javadoc/2.1/com/google/gwt/view/client/CellPreviewEvent.html – EMM

+3

我相信我將無法嘲笑這種方式爲getEventTarget()方法是FINAL&RETURN_DEEP_STUBS不支持最終方法或最終類 – EMM

1

我認爲這個問題是,你試圖在客戶端瀏覽器環境外運行的GWT代碼。 GWT旨在被轉換爲JavaScript並在瀏覽器上運行。我不確定它會起作用。

我注意到NativeEvent的第137行似乎是DomImpl.impl.eventGetTarget。這使我相信DomImpl.implnull

我發現通過查看以下代碼:

45 public static <T> T create(Class<?> classLiteral) { 
46  if (sGWTBridge == null) { 
47  /* 
48  * In Production Mode, the compiler directly replaces calls to this method 
49  * with a new Object() type expression of the correct rebound type. 
50  */ 
51  throw new UnsupportedOperationException(
52   "ERROR: GWT.create() is only usable in client code! It cannot be called, " 
53    + "for example, from server code. If you are running a unit test, " 
54    + "check that your test case extends GWTTestCase and that GWT.create() " 
55    + "is not called from within an initializer or constructor."); 
56  } else { 
57  return sGWTBridge.<T> create(classLiteral); 
58  } 
59 } 

你有沒有擴展GWTTestCase

+0

不,我通常用「擴展的TestCase」我使用HTTP的Mockito。: //code.google.com/p/mockito/ – EMM