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

时间:2015-06-16 05:54:53

标签: java gwt gwtmockito

我遇到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事件?

1 个答案:

答案 0 :(得分:0)

让我们一起阅读这些代码:

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

    问题在于,当我运行单元测试时,我在按钮上发出了一个点击事件&#34; ChangeStatus&#34;但是我想在按钮&#34; Clear&#34;

    上点击一下      

    当我更改声明处理程序的顺序然后我可以通过&#34;清除&#34;按钮

    是的,这正是给定代码的预期行为。如果要分开按钮,请使用不同的模拟按钮。

    IMO,更好的方法是: *让getClearButtongetChangeStatusButton返回HasClickHandlers,因此您甚至不需要GwtMockito,只能使用裸Mockito。 *重构您的代码,以便视图添加点击处理程序,将演示者传递给视图,然后视图可以从点击处理程序(例如presenter.clear()presenter.changeStatus())调用演示者方法。因此,对于演示者测试,您只需调用演示者方法即可。再一次,你不再需要gwtMockito,只能使用裸Mockito。见http://www.gwtproject.org/articles/mvp-architecture-2.html

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