0

我对 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();

    }

我想测试的代码看起来像(我从构造函数调用这个方法):

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”上制作了一个点击事件,但我想在“Clear”按钮上制作一个点击事件

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

如何解决这个问题呢?如何在特定按钮上调用点击事件?

4

1 回答 1

0

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

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

问题是,当我运行单元测试时,我在按钮“ChangeStatus”上制作了一个点击事件,但我想在“Clear”按钮上制作一个点击事件

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

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


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

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

于 2015-06-16T08:36:52.387 回答