0

GWT 测试部分描述了如何验证PresenterinDisplay对象的输出,但没有解释如何反其道而行之。换句话说,我想检查当用户点击按钮时是否Presenter会发出正确的请求。RPC ServiceDisplay

如何模拟按钮点击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));      
}
4

1 回答 1

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 中运行的类。

于 2013-02-19T11:52:07.683 回答