この問題は例を挙げて最もよく説明されていると思います。
public class MyService {
private OtherService theOther;
public void setTheOther(OtherService srv) { theOther = srv; }
public void myBusinessStuffFor(int id) {
theOther.applyToAllWith(id, new OtherService.Action() {
public void apply(Object whatever) {
doTheHardBusinessStuffWith(whatever);
}
}
}
private void doTheHardBusinessStuffWith(Object whatever) {
// here the business stuff provided by MyService
}
}
public interface OtherService {
void applyToAllWith(int id, Action action);
public interface Action {
void applyOn(Object whatever);
}
}
とてもまとまりがあるので、私はこのパターンが好きです。アクションインターフェイスは、それらのサービスとペアになっています。ビジネスロジックは、多くのクラスで乱雑ではありません。サブクラスはアクションにデータを提供するだけであり、忙しくする必要はありません。ここから採用しました(http://jamesladdcode.com/?p=12)。問題は、otherServiceをモックした場合に、「doTheHardBusinessStuffWith(Objectwhatever)」メソッドの動作をテストするための適切なソリューションが見つからなかったことです。モックでは、ビジネスメソッドがどのように呼び出されるかを気にする必要があります。しかし、どうすればこれを行うことができますか。私はmockitoを使用し、すでにArgumentCaptureで試しました。しかし、ArgumentCaptureを悪用しているため、正しく感じられません。
クラスMyService.myBusinessStuffFor(int id)で使用されているパターンに名前があるかどうか(戦略パターンですか)を知りたいですか?しかし、私の主な質問は、OtherServiceのモックでこのコードをテスト可能にする方法です。