Design patterns 单元测试中工厂/抽象工厂设计模式的使用

Design patterns 单元测试中工厂/抽象工厂设计模式的使用,design-patterns,junit,factory,abstract-factory,Design Patterns,Junit,Factory,Abstract Factory,有人告诉我,用于编写单元测试用例的工厂/抽象工厂设计模式非常有效,但我还没有找到任何教程能够清楚地说明这一点。因此,如果有人能给我指出任何现有的教程,或者在这里给我一些伪代码和解释,那将是非常有帮助的:)根据GoF的说法,抽象工厂模式的意图是提供一个接口,用于创建相关或从属对象的族,而无需指定它们的conrcete类 在框架中,抽象工厂通常使用依赖注入提供,这是编写易于测试的代码的真正关键。依赖项注入只是意味着依赖项通过构造函数“注入”,而不是在类中更新 假设您使用两个工厂为简单和困难的双陆棋游

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

根据GoF的说法,抽象工厂模式的意图是提供一个接口,用于创建相关或从属对象的族,而无需指定它们的conrcete类

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

假设您使用两个工厂为简单和困难的双陆棋游戏生成依赖项(这里只有一个依赖项,骰子):

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());
  }
}
使用这种方法,可以为测试目的注入任何具体的依赖项。但是,通常在没有抽象工厂的情况下也可以实现同样的功能,即,可以注入依赖项本身,而不是注入工厂