design-patterns - 在单元测试中使用工厂/抽象工厂设计模式

标签 design-patterns junit factory abstract-factory

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

最佳答案

据 GoF 称,意向抽象工厂模式的主要目的是提供一个接口(interface)来创建相关或依赖对象的族,而无需指定它们的具体类。

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

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

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

关于design-patterns - 在单元测试中使用工厂/抽象工厂设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7507898/

相关文章:

java - 如何在 java 中的 mockito 中为 Map 对象创建参数捕获器?

android - 如何模拟系统类进行类型转换

design-patterns - 请举一个工厂方法模式的例子

javascript - 如何在 Angular 的工厂方法中返回数据?

java - 如何在CQRS中设计查询层

c# - 每个实现都需要不同参数的模板方法模式?

c# - 一个大存储库与许多小存储库?

java - 什么是应用程序 Controller 模式?

java - Gradle:如何列出所有 "given tests"

java - 如果我在工厂类中实现 ThreadLocal 会发生什么