5

有人告诉我,用于编写单元测试用例的工厂/抽象工厂设计模式非常有效,但我还没有找到任何可以清楚地展示它的教程。因此,如果有人可以向我指出任何现有的教程或在这里给我一些伪代码和解释,那将非常有帮助:)

4

1 回答 1

6

根据 GoF 的说法,抽象工厂模式的目的是为创建相关或依赖对象系列提供一个接口,而无需指定它们的具体类。

在框架中,抽象工厂通常使用依赖注入来提供,这是编写易于测试的代码的真正关键。依赖注入只是意味着依赖是通过构造函数“注入”的,而不是在类内部新建。

假设您使用两个工厂来生成依赖项(这里只有一个依赖项,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());
  }
}

使用这种方法,可以注入任何具体的依赖项以进行测试。然而,通常可以在没有抽象工厂的情况下实现相同的效果,即可以注入依赖项本身,而不是注入工厂。

于 2012-02-08T20:23:03.007 回答