小编Ant*_* M.的帖子

使用异步调用测试GWTP演示者

我正在使用GWTP,添加一个Contract层来抽象Presenter和View之间的知识,我对GWTP的结果非常满意.我正在用Mockito测试我的主持人.

但随着时间的推移,我发现通过测试很难保持干净的演示者.我做了一些改进的改进,但我还是不满意.

我发现以下内容是问题的核心:我的演示者经常需要异步调用,或者通常使用回调调用对象方法来继续我的演示者流程(它们通常是嵌套的).

例如 :

  this.populationManager.populate(new PopulationCallback()
  {
     public void onPopulate()
     {
        doSomeStufWithTheView(populationManager.get());
     }
  });
Run Code Online (Sandbox Code Playgroud)

在我的测试中,我结束了验证被模拟的PopulationManager对象的population()调用.然后在doSomeStufWithTheView()方法上创建另一个测试.

但我很快发现这是糟糕的设计:任何改变或重构都会破坏我的大量测试,并迫使我从其他人开始创建,即使演示者功能没有改变!另外,我没有测试回调是否真正符合我的要求.

所以我尝试使用mockito doAnswer方法来破坏我的演示者测试流程:

doAnswer(new Answer(){
     public Object answer(InvocationOnMock invocation) throws Throwable
     {
        Object[] args = invocation.getArguments();
        ((PopulationCallback)args[0]).onPopulate();
        return null;
     }
 }).when(this.populationManager).populate(any(PopulationCallback.class));
Run Code Online (Sandbox Code Playgroud)

我考虑到它的代码更简洁(并且内部更少依赖于arg位置):

doAnswer(new PopulationCallbackAnswer())
  .when(this.populationManager).populate(any(PopulationCallback.class));
Run Code Online (Sandbox Code Playgroud)

因此,在模拟人口管理器时,我仍然可以测试我的演示者的流程,基本上是这样的:

@Test
public void testSomeStuffAppends()
{
  // Given
  doAnswer(new PopulationCallbackAnswer())
  .when(this.populationManager).populate(any(PopulationCallback.class));

  // When
  this.myPresenter.onReset();

  // Then
  verify(populationManager).populate(any(PopulationCallback.class)); // That was before
  verify(this.myView).displaySomething(); // Now I can do that.
}
Run Code Online (Sandbox Code Playgroud)

我想知道它是否很好地使用了doAnswer方法,或者它是否有代码味道,并且可以使用更好的设计?

通常,我的演示者倾向于使用其他对象(如某些Mediator Pattern)并与视图进行交互.我有一些主持人有几百(~400)行代码.

再一次,它是不良设计的证明,还是主持人冗长是正常的(因为它使用其他对象)?

有没有人听说过一些使用GWTP并干净地测试其主持人的项目?

我希望我能以全面的方式解释.

先感谢您.

PS:我对Stack Overflow很新,加上我的英语仍然缺乏,如果我的问题需要改进,请告诉我.

testing gwt mockito gwt-platform

8
推荐指数
1
解决办法
393
查看次数

标签 统计

gwt ×1

gwt-platform ×1

mockito ×1

testing ×1