私は GWTP を使用しており、コントラクト レイヤーを追加してプレゼンターとビューの間の知識を抽象化しています。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));
私はそれがより冗長になるようにコードを因数分解しました(そして内部的に引数の位置にあまり依存しません):
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 メソッドの上手な使い方なのか、コードの匂いがして、もっといいデザインが使えるのか気になります。
通常、私のプレゼンターは他のオブジェクト (メディエーター パターンなど) を使用して、ビューと対話する傾向があります。数百 (~400) 行のコードを持つプレゼンターがいます。
繰り返しますが、これは悪い設計の証明ですか、それともプレゼンターが冗長であることは正常ですか (他のオブジェクトを使用しているため) ?
GWTP を使用してプレゼンターをクリーンにテストするプロジェクトについて聞いた人はいますか?
総合的に説明していただければ幸いです。
前もって感謝します。
PS : 私は Stack Overflow にかなり慣れていません。また、英語がまだ不十分です。質問に改善が必要な場合は、教えてください。