2012-03-23 8 views
0

Einfache Frage:GWT Prüfung mit Mockito

Überprüfung (1) besteht. Überprüfung (2) nicht. Warum? Wie man es repariert?

-Test

@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"); 
      } 
     }); 

    } 

Antwort

0

Als David Wallace sagte, sind Sie auf die Schaltfläche spöttisch. Es verliert alle seine Fähigkeiten. Sie könnte dieses Problem beheben, indem ein ArgumentCatptor machen

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

Dann manuell die Funktion des Ereignisses ausgelöst durch den Einsatz:

captor.getValue().onClick(null); 

Dies wird Fälschung der Anruf, der durch die Taste gemacht werden sollte.

Wenn Ihre Klasse nur eine Schaltfläche oder einen Catcher für ein bestimmtes Ereignis aufweist, können Sie die ClickHandler-Klasse erweitern. Dann kannst du einfach den onClick deiner Klasse aufrufen.

1

Weil Knopf verspottet aus wurde und es keine Umsetzung es zu sagen, was, wenn fireevent genannt zu tun. Siehe die Zeile:

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

weil button ein Mock ist, so fireEvent fordert sie auf, eigentlich nicht das Ereignis ausgelöst; und onClick wird nie in der Ansicht aufgerufen.

0

Das ist, was ich getan habe:

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;   
     } 

    };