2012-03-23 136 views
0

簡單問題:用mockito GWT測試

驗證(1)通過。 驗證(2)不。爲什麼?如何解決它?

測試

@Test 
    public void test() { 
      System.out.println("test"); 
      EventBus eb = mock(EventBus.class); 
      MyWidget.View v = mock(MyWidget.View.class); 
      GreetingServiceAsync s = mock(GreetingServiceAsync.class); 

      HasClickHandlers button = mock(HasClickHandlers.class); 

      when(v.getButton()).thenReturn(button); 

      new MyWidget(eb, v, s); 

      button.fireEvent(mock(ClickEvent.class)); 

      verify(button).addClickHandler(any(ClickHandler.class)); (1) 
      verify(v).alert(anyString()); (2) 


     } 

的Widget

@Inject 
    public MyWidget(EventBus eventBus, View view, GreetingServiceAsync service){ 
     this.view = view; 
     this.service = service; 

     bindView(); 
     bindEventBus(); 

    } 

    private void bindView(){ 

     view.getButton().addClickHandler(new ClickHandler() { 

      @Override 
      public void onClick(ClickEvent event) { 
       view.alert("test"); 
      } 
     }); 

    } 

回答

0

正如大衛·華萊士說,你是嘲諷的按鈕。它確實失去了所有的能力。 你可以通過製作ArgumentCatptor

ArgumentCaptor<ClickHandler> captor = ArgumentCaptor.forClass(ClickHandler.class); 

然後通過手動觸發事件的功能,解決這個問題:

captor.getValue().onClick(null); 

這將假應該已經通過按鈕發出的呼籲。

如果你的類只有一個按鈕或一個特定事件捕捉器,你可以擴展ClickHandler類。然後你可以調用你的班級的onClick。

1

因爲巴頓被嘲笑並沒有執行告訴它當fireEvent被稱爲做什麼。見行:

HasClickHandlers button = mock(HasClickHandlers.class); 
... 
button.fireEvent(mock(ClickEvent.class)); 
3

因爲button是一個模擬的,所以要求它fireEvent實際上並不觸發事件;並且onClick從未在視圖上被調用。

0

這就是我所做的:

public class ClickableElement implements HasClickHandlers{ 

     ClickHandler ch; 
     @Override 
     public void fireEvent(GwtEvent<?> event) { 
      ch.onClick((ClickEvent) event); 
     } 

     @Override 
     public HandlerRegistration addClickHandler(ClickHandler handler) { 
      this.ch = handler; 
      return null;   
     } 

    };