简单问题:
验证(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 :(得分:3)
因为button
是一个模拟,所以在它上面调用fireEvent
实际上不会触发事件;并且永远不会在视图上调用onClick
。
答案 1 :(得分:1)
因为Button被模拟了,并且没有实现告诉它在调用fireEvent时该怎么做。见行:
HasClickHandlers button = mock(HasClickHandlers.class);
...
button.fireEvent(mock(ClickEvent.class));
答案 2 :(得分: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;
}
};
答案 3 :(得分:0)
正如大卫华莱士所说,你在嘲笑按钮。它确实失去了所有的能力。 你可以通过制作一个ArgumentCatptor
来解决这个问题ArgumentCaptor<ClickHandler> captor = ArgumentCaptor.forClass(ClickHandler.class);
然后使用以下方法手动触发事件的功能:
captor.getValue().onClick(null);
这会伪造按钮应该进行的调用。
如果您的类只有一个按钮或一个特定事件的捕获器,您可以使它扩展ClickHandler类。然后你可以调用你班上的onClick。