2012-03-23 3 views
0

Простой вопрос:Испытания GWT с помощью mockito

Проверка (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;   
     } 

    };