java - 减少单元测试的责任和合作者

标签 java unit-testing anti-patterns

我有一个类,它有明确的职责 - 用对象所需的信息“丰富”对象。该信息是从各种来源(服务)收集的。例如:

public class Enricher
{
      private CounterpartyService counterPartyService;
      private BookingEntityService bookingEntityService;
      private ExchangeRateService exchangeRateService;
      private BrokerService brokerService;
      ... 6 more services

    public EnrichedTradeRequest enrichTrade(TradeRequest request)
    {
        EnrichedTradeRequest enrichedRequest = new EnrichedRequest(request);

        // Enrich with counterparty info
        enrichedRequest = enrichCounterParty(enrichedRequest)

        // Enrich with booking entity info
        enrichedRequest = enrichBookingEntity(enrichedRequest)

        // Enrich with exchange rate info
        ...

        // Enrich with broker info
        ...

        // ....etc
        return enrichedRequest;
    }

    private EnrichedTradeRequest enrichCounterparty(EnrichedRequest enrichedRequest)
    {
        // Get info from CounterpartyService
        // ...

        return enrichedRequest;
    }

此处包含“如何”丰富请求的逻辑。例如,该类可以扩展到不同类型的贸易。

我们一步丰富了交易,因为我们不希望任何部分丰富的物体漂浮在周围,这没有多大意义。

这个类确实很难进行单元测试,因为它有很多协作者(它调用了多达 12 个其他服务)。我需要模拟 12 个服务,每个服务有 3 或 4 种不同的方法。

在这种情况下,如何减少协作者的数量,并使该代码可测试?

最佳答案

根本问题是协作者太多。如果难以测试,那么设计可能可以改进。

一种选择是创建一个外观服务来管理协作者的交互。在您的情况下,您可能有一个外观层次结构,因为只有一个外观只会将大量模拟的需求转移到另一个区域,这并不能解决问题。如果可能,尝试将更有可能一起使用的服务分组到外观中。或者,如果您总是跨服务一起调用相同的 X 方法,请将该功能放在某个地方的单个方法中。如果您有一个外观,它又调用 3-4 个其他外观,则每个测试只需要 3-4 个模拟,这更易于管理。

最终结果将是您的“丰富器”将仅调用一个外观服务,因此测试将很容易。权衡是需要测试您的外墙,这将是可管理的。

关于java - 减少单元测试的责任和合作者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6717601/

相关文章:

java - 从 RichFaces 中的 xhtml 访问 bean 对象方法

java - JavaFX 中的 NullPointerException 在 TableView 中初始化

java - 在方法参数中使用 Object 父类(super class)

python - Django 测试外部脚本

unit-testing - Swift - 涉及 IBOutlets 的单元测试功能?

python - 替代 'for i in xrange(len(x))'

c++ - 使实现多个接口(interface)的 COM 类保持可管理的好方法

java - 私信 channel 中使用斜杠命令识别机器人

design-patterns - 这种反模式/代码气味有名字吗?

unit-testing - XUnit 是否跨测试类共享 fixture 实例?