5

ユニット テスト ケースを記述するための Factory / Abstract Factory Design Patterns は非常に効果的であると言われていますが、それを明確に示すチュートリアルを見つけることができませんでした。したがって、誰かが既存のチュートリアルを教えてくれるか、ここで疑似コードと説明を教えてくれれば非常に役に立ちます:)

4

1 に答える 1

6

GoF によると、Abstract Factory パターンの目的は、具体的なクラスを指定せずに、関連オブジェクトまたは依存オブジェクトのファミリを作成するためのインターフェイスを提供することです。

フレームワークでは、通常、抽象ファクトリは依存性注入を使用して提供されます。これは、テストが容易なコードを作成するための真の鍵です。依存性注入とは、依存性がクラス内で新しく作成されるのではなく、コンストラクターを介して「注入」されることを意味します。

2 つのファクトリを使用して、バックギャモンの簡単なゲームと難しいゲームの依存関係 (ここでは 1 つの依存関係、Dice) を生成するとします。

public class EasyGameFactory implements GameFactory
{
  Dice createDice()
  {
    return new LuckyDice();
  }
}

public class NormalGameFactory implements GameFactory
{
  Dice createDice()
  {
    return new RandomDice();
  }
}

単体テストの目的で、Dice 実装のどちらも使用したくないので、GameFactory の特別な実装を作成します。

public class CustomGameFactory implements GameFactory
{
  private Dice mDice;

  public CustomGameFactory(Dice dice)
  {
    mDice = dice;
  }

  Dice createDice()
  {
    return mDice;
  }
}

このファクトリは、生産コード ツリーの一部である必要はありません。テスト コードを使用して、Dice の特別な実装をファクトリに提供します。

public class TestBackgammon
{
  @Test public void shouldReturnDiceThrown() 
  {
    SettableDice dice = new SettableDice();
    Game game = new GameImpl(new CustomGameFactory(dice));

    dice.setDice(new int[] {4, 5});
    game.nextTurn();
    assertArrayEquals(new int[] {4, 5}, game.diceThrown());
  }
}

このアプローチでは、具体的な依存関係をテスト目的で注入できます。ただし、多くの場合、Abstract Factory がなくても同じことが実現できます。つまり、ファクトリを注入するのではなく、依存関係自体を注入できます。

于 2012-02-08T20:23:03.007 に答える