2012-03-23 98 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;   
     } 

    };