我对GwtMock和单击处理程序有问题。
在我的单元测试中,我有一个ClickHandler和Button字段:
@GwtMock 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();
}
});
}问题是,当我运行一个单元测试时,我会在"ChangeStatus“按钮上设置一个单击事件,但是我希望使一个单击事件按钮”清除“。
当我更改声明处理程序的顺序时,有趣的是,我可以通过“清除”按钮调用代码。
如何解决这个问题?如何调用特定按钮上的单击事件?
发布于 2015-06-16 08:36:52
让我们一起读一下这段代码:
getClearButton()或getChangeStatusButton()时,都返回this.button;也就是说,对于两个方法调用都使用相同的按钮,这意味着您将无法分辨哪个是哪个:它就是相同的。addClickHandler时,将单击处理程序存储在一个字段中;也就是说,如果addClickHandler被调用两次,第二个调用将用第二个单击处理程序覆盖该字段,您将不再引用第一个。getClearButton()和getChangeStatusButton(),并在两者上调用addClickHandler;也就是说,在this.button上调用addClickHandler两次。问题是,当我运行一个单元测试时,我会在"ChangeStatus“按钮上设置一个单击事件,但是我希望使一个单击事件按钮”清除“。 当我更改声明处理程序的顺序时,有趣的是,我可以通过“清除”按钮调用代码。
是的,这正是您的代码所期望的行为。如果要区分按钮,请使用不同的模拟按钮。
海事组织,更好的方法是:*让getClearButton和getChangeStatusButton返回HasClickHandlers,这样您甚至不需要GwtMockito,只需使用裸Mockito即可。*重构代码,以便视图添加单击处理程序,将演示程序传递给视图,视图可以从单击处理程序(例如,presenter.clear()和presenter.changeStatus())调用演示器方法。因此,对于演示程序测试,只需调用演示者方法即可。同样,您不再需要gwtMockito,只需使用裸Mockito即可。请参阅http://www.gwtproject.org/articles/mvp-architecture-2.html
GwtMockito更适合于在代码中不分离视图和演示者的情况,而是使用UiBinder类来扮演演示者的角色,而.ui.xml是视图。
https://stackoverflow.com/questions/30859776
复制相似问题