使用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)

        }

小工具

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

因为button是一个mock,所以在它上调用fireEvent实际上不会触发事件;并且CCD_ 3从未在视图上被调用。

因为Button被模拟掉了,并且没有实现告诉它在调用fireEvent时该做什么。见行:

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

正如David Wallace所说,你在嘲笑按钮。它确实失去了所有的能力。你可以通过制作ArgumentCaptor 来解决这个问题

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

然后使用手动启动事件功能

captor.getValue().onClick(null);

这将伪造本应通过按钮进行的呼叫。

如果您的类对于特定事件只有一个按钮或一个捕获器,则可以使其扩展ClickHandler类。然后你就可以调用类的onClick了。

我就是这么做的:

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

相关内容

  • 没有找到相关文章

最新更新