GWT тестирование с мокито - PullRequest
0 голосов
/ 24 марта 2012

Простой вопрос:

Проверка (1) прошла. Проверка (2) не делает. Зачем? Как это исправить?

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

    }

Ответы [ 4 ]

3 голосов
/ 24 марта 2012

, потому что button это макет, поэтому вызов fireEvent для него фактически не запускает событие; и onClick никогда не вызывается в представлении.

1 голос
/ 24 марта 2012

Поскольку Button был смоделирован, и нет никакой реализации, говорящей ему, что делать, когда вызывается fireEvent. Смотрите строчку:

HasClickHandlers button = mock(HasClickHandlers.class);
...
button.fireEvent(mock(ClickEvent.class));   
0 голосов
/ 01 мая 2015

Как сказал Дэвид Уоллес, вы издеваетесь над кнопкой.Он теряет все свои способности.Вы можете исправить это, сделав ArgumentCatptor

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

Затем вручную запустите функцию события, используя:

captor.getValue().onClick(null);

Это будет фальсифицировать вызов, который должен был быть сделан кнопкой.

Если в вашем классе есть только одна кнопка или одна перехватчик для определенного события, вы можете сделать так, чтобы он расширял класс ClickHandler.Тогда вы можете просто вызвать onClick вашего класса.

0 голосов
/ 24 марта 2012

Вот что я сделал:

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

    };
...