用mockito进行GWT测试

用mockito进行GWT测试,gwt,testing,mvp,mockito,Gwt,Testing,Mvp,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

简单问题:

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

    }
小部件

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

    }

因为按钮是模拟出来的,并且并没有实现告诉它在调用fireEvent时该做什么。请参见第行:

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

因为按钮是模拟出来的,并且并没有实现告诉它在调用fireEvent时该做什么。请参见第行:

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

因为
按钮
是一个模拟按钮,所以对其调用
firevent
实际上不会触发事件;视图中从不调用
onClick

因为
按钮
是模拟的,所以对其调用
fireEvent
实际上不会触发事件;而且视图中从未调用过
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;        
        }

    };
公共类ClickableElement实现HasClickHandler{
ClickHandler-ch;
@凌驾
公共无效火灾事件(GwtEvent事件){
ch.onClick((ClickEvent)事件);
}
@凌驾
公共句柄注册addClickHandler(ClickHandler处理程序){
this.ch=处理器;
返回null;
}
};
我就是这么做的:

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

    };
公共类ClickableElement实现HasClickHandler{
ClickHandler-ch;
@凌驾
公共无效火灾事件(GwtEvent事件){
ch.onClick((ClickEvent)事件);
}
@凌驾
公共句柄注册addClickHandler(ClickHandler处理程序){
this.ch=处理器;
返回null;
}
};

正如大卫·华莱士所说,你在嘲笑按钮。它确实失去了所有的能力。 你可以通过制作一个议论文来解决这个问题

ArgumentCaptor<ClickHandler> captor = ArgumentCaptor.forClass(ClickHandler.class);
这将伪造本应通过按钮拨打的电话


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

正如大卫·华莱士所说,你在模仿按钮。它确实失去了所有的能力。 你可以通过制作一个议论文来解决这个问题

ArgumentCaptor<ClickHandler> captor = ArgumentCaptor.forClass(ClickHandler.class);
这将伪造本应通过按钮拨打的电话

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