gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:49:56 24 4
gpt4 key购买 nike

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

最佳答案

据 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com