我遇到GwtMock和点击处理程序的问题。
在我的单元测试中,我有一个包含ClickHandler和Button的字段:
@GwtMock 私人ClickHandler clickHandler;
我的setUp方法如下:
@Before
public void setUp() {
when(this.display.getClearButton()).thenReturn(this.button);
when(this.display.getChangeStatusButton()).thenReturn(this.button);
}
我的测试看起来像:
@Test
public void shouldClearFilterAfterClickClearFilterButton() {
// given
when(this.button.addClickHandler(any(ClickHandler.class))).thenAnswer(new Answer<Object>() {
public Object answer(InvocationOnMock aInvocation) throws Throwable {
clickHandler = (ClickHandler) aInvocation.getArguments()[0];
return null;
}
});
this.presenter = new PresenterImpl(this.display, this.messages);
// when
clickHandler.onClick(clickEvent);
// then
this.presenter.asWidget();
}
我想测试的代码看起来像(我从contructor中调用这个方法):
private void addHandlers() {
this.display.getClearButton().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
clearFilter();
}
});
this.display.getChangeStatusButton().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
changeStatus();
}
});
}
问题在于,当我运行单元测试时,我在按钮上发出了一个点击事件&#34; ChangeStatus&#34;但是我想在按钮&#34; Clear&#34;
上点击一下当我更改声明处理程序的顺序然后我可以通过&#34;清除&#34;按钮
如何解决这个问题?如何在特定按钮上调用click事件?
答案 0 :(得分:0)
让我们一起阅读这些代码:
getClearButton()
或getChangeStatusButton()
时,都会返回this.button
;也就是说,两个方法调用的按钮完全相同,这意味着你无法分辨出哪个是:它只是一样。addClickHandler
,就将点击处理程序存储在字段中;也就是说,如果addClickHandler
被调用两次,则第二次调用将使用第二个单击处理程序覆盖该字段,并且您将不再引用第一个字段。getClearButton()
和getChangeStatusButton()
,并在两者上调用addClickHandler
;也就是说,在addClickHandler
上拨打this.button
两次。问题在于,当我运行单元测试时,我在按钮上发出了一个点击事件&#34; ChangeStatus&#34;但是我想在按钮&#34; Clear&#34;
上点击一下当我更改声明处理程序的顺序然后我可以通过&#34;清除&#34;按钮
是的,这正是给定代码的预期行为。如果要分开按钮,请使用不同的模拟按钮。
IMO,更好的方法是:
*让getClearButton
和getChangeStatusButton
返回HasClickHandlers
,因此您甚至不需要GwtMockito,只能使用裸Mockito。
*重构您的代码,以便视图添加点击处理程序,将演示者传递给视图,然后视图可以从点击处理程序(例如presenter.clear()
和presenter.changeStatus()
)调用演示者方法。因此,对于演示者测试,您只需调用演示者方法即可。再一次,你不再需要gwtMockito,只能使用裸Mockito。见http://www.gwtproject.org/articles/mvp-architecture-2.html
AFAICT,GwtMockito更适合您不在代码中分离视图和演示者的情况,而是使用UiBinder与扮演演示者角色的Java类,.ui.xml
是图。