gpt4 book ai didi

gwt - 使用异步调用测试 GWTP Presenter

转载 作者:行者123 更新时间:2023-11-28 19:45:19 25 4
gpt4 key购买 nike

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

但随着时间的推移,我发现很难通过测试来保持一个干净的演示者。我做了一些重构来改进它,但我仍然不满意。

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

例如:

  this.populationManager.populate(new PopulationCallback()
{
public void onPopulate()
{
doSomeStufWithTheView(populationManager.get());
}
});

在我的测试中,我结束了验证模拟 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));

我分解了代码以使其不那么冗长(并且在内部较少依赖于 arg 位置):

doAnswer(new PopulationCallbackAnswer())
.when(this.populationManager).populate(any(PopulationCallback.class));

所以在模拟 populationManager 时,我仍然可以测试我的演示者的流程,基本上就是这样:

@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.
}

我想知道是doAnswer方法的好用,还是代码味道,可以使用更好的设计?

通常,我的演示者倾向于只使用其他对象(比如一些调解器模式)并与 View 交互。我有一些演示者有几百 (~400) 行代码。

再一次,这是糟糕设计的证明,还是演示者冗长冗长是正常的(因为它使用了其他对象)?

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

我希望我解释的很全面。

提前谢谢你。

PS : 我是 Stack Overflow 的新手,而且我的英语还很欠缺,如果我的问题需要改进,请告诉我。

最佳答案

你可以使用ArgumentCaptor:
看看这个 blog post更多细节。

关于gwt - 使用异步调用测试 GWTP Presenter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13741784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com