如何在View / Display中模拟点击事件以进行测试?

时间:2013-02-18 22:12:08

标签: java gwt testing mvp

GWT testing部分介绍了如何验证Presenter对象中Display的输出,但没有说明如何进行相反的操作。换句话说,当用户点击Presenter中的按钮时,我想检查RPC Service是否会向Display发出正确的请求。

如何模拟Display中的按钮点击?触发GWT事件并不简单,因为它们具有受保护的构造函数。有没有办法简单地做到这一点,没有继承ClickEvent类?

@Before
protected void setUp() {
    mockRpcService = mock(NegotiationServiceAsync.class);
    eventBus = new HandlerManager(null);
    mockDisplay = mock(NegotiationPresenter.Display.class);
    negotiationPresenter = new NegotiationPresenter(mockRpcService,
            eventBus, mockDisplay);
}

@Test
private void testSth() {        
    when(mockDisplay.getSuppliersEmails()).thenReturn("address@domain.com");
    when(mockDisplay.getTaskDescription()).thenReturn("This is the task to do");

    // This does not work
    mockDisplay.getSubmitButton().fireEvent(new ClickEvent());      

    verify(mockRpcService).startTask(any(NegotiationRequest.class), any(AsyncCallback.class));      
}

1 个答案:

答案 0 :(得分:1)

当您使用MVP时,通常会在演示者中测试方法,注入视图的模拟实现,因此在测试中,显示不执行任何操作,只是向演示者提供存根方法。 另一方面,您的真实显示实现应该将所有操作委托给演示者。

当用户点击提交按钮时测试演示者行为的方法是在演示者中调用方法,如下所示:

@Test
private void testSth() {        
  when(mockDisplay.getSuppliersEmails()).thenReturn("address@domain.com");
  when(mockDisplay.getTaskDescription()).thenReturn("This is the task to do");

  negotiationPresenter.onSubmit();

  verify(mockRpcService).startTask(any(NegotiationRequest.class),
                                   any(AsyncCallback.class));      
}

一个非常不同的情况是,如果你想使用GWTTestCase测试你的代码,那么你可以使用真实的视图实现,但在这种情况下,你的测试将持续很长时间,失去使用MVP的主要目标之一,即,分离视图以测试主应用程序代码,该代码应该在Presenters和可以在JVM中运行的类中。