首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GwtMockito -单击多个按钮的处理程序

GwtMockito -单击多个按钮的处理程序
EN

Stack Overflow用户
提问于 2015-06-16 05:54:53
回答 1查看 341关注 0票数 0

我对GwtMock和单击处理程序有问题。

在我的单元测试中,我有一个ClickHandler和Button字段:

@GwtMock clickHandler;

我的setUp方法如下所示:

代码语言:javascript
复制
@Before
public void setUp() {
    when(this.display.getClearButton()).thenReturn(this.button);
    when(this.display.getChangeStatusButton()).thenReturn(this.button);
}

我的测试看起来是:

代码语言:javascript
复制
@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调用此方法):

代码语言:javascript
复制
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“按钮上设置一个单击事件,但是我希望使一个单击事件按钮”清除“。

当我更改声明处理程序的顺序时,有趣的是,我可以通过“清除”按钮调用代码。

如何解决这个问题?如何调用特定按钮上的单击事件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-16 08:36:52

让我们一起读一下这段代码:

  1. 每当调用getClearButton()getChangeStatusButton()时,都返回this.button;也就是说,对于两个方法调用都使用相同的按钮,这意味着您将无法分辨哪个是哪个:它就是相同的。
  2. 每当在模拟按钮上调用addClickHandler时,将单击处理程序存储在一个字段中;也就是说,如果addClickHandler被调用两次,第二个调用将用第二个单击处理程序覆盖该字段,您将不再引用第一个。
  3. 测试中的代码同时调用getClearButton()getChangeStatusButton(),并在两者上调用addClickHandler;也就是说,在this.button上调用addClickHandler两次。

问题是,当我运行一个单元测试时,我会在"ChangeStatus“按钮上设置一个单击事件,但是我希望使一个单击事件按钮”清除“。 当我更改声明处理程序的顺序时,有趣的是,我可以通过“清除”按钮调用代码。

是的,这正是您的代码所期望的行为。如果要区分按钮,请使用不同的模拟按钮。

海事组织,更好的方法是:*让getClearButtongetChangeStatusButton返回HasClickHandlers,这样您甚至不需要GwtMockito,只需使用裸Mockito即可。*重构代码,以便视图添加单击处理程序,将演示程序传递给视图,视图可以从单击处理程序(例如,presenter.clear()presenter.changeStatus())调用演示器方法。因此,对于演示程序测试,只需调用演示者方法即可。同样,您不再需要gwtMockito,只需使用裸Mockito即可。请参阅http://www.gwtproject.org/articles/mvp-architecture-2.html

GwtMockito更适合于在代码中不分离视图和演示者的情况,而是使用UiBinder类来扮演演示者的角色,而.ui.xml是视图。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30859776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档