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