我正在使用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很新,加上我的英语仍然缺乏,如果我的问题需要改进,请告诉我.