【发布时间】:2016-06-23 16:53:01
【问题描述】:
在阅读了 Uncle Bob 博客和 TSS id DEAD 文章后,我想编写更多测试代码。
我的应用程序正在使用层:ApplicationService -> 模型 -> 支持。
应用服务定义用例。这是一些程序代码(loadX,调用 X.doSomething,saveX)。在某些情况下,appService 类需要大量的外部依赖项。
例如,我在“工作流程”的末尾使用了一个对象“D”。因此,在使用它时,我需要检查与该对象链接的对象“A”/“B”/“C”的一些规则。假设我们有 3 个相关的实体,每个实体都有自己的存储库,在非常特殊的用例中,我需要更深入地检查另一个规则(例如“AA”== 另一个存储库)。
我的 appService 将有 8 到 10 个依赖项(5 个存储库 + 一些业务服务间实体)。测试不是我的“强项”。嘲笑太多服务时我缺乏勇气。如果每个服务有 3 个方法但我的 appService 只需要一个,那么我需要知道要模拟或模拟/存根所有方法的方法(以及模拟/存根 2/3 的无用方法)。
我认为有很多问题。我的第一个是依赖项太多。我只是不想拆分依赖项并将它们隐藏在地毯下。当然,域实体也可能存在问题:边界不好、分离过多等。
阅读article (uncle bob) 后,我在想:我做错了。也许 appService 需要用它需要的东西来表达/声明一个接口。但是如何命名呢?怎么拆分呢?我不确定将不相关的服务放在一起是否是个好主意。编写类似外观的东西,测试会变得更容易(我现在知道我的类与这些外部服务耦合,并且我确切地知道哪些)。
- 如何测试您的 appServices ? (仅限单元测试或集成测试?)
- 您认为拆分注入的服务(类似于“外观”或更多业务或其他内容)是一种好方法吗?
谢谢
更新 1 (23.06.2016): 例如,这里对于应用程序服务类 DPAppService 其依赖项列表:
DPRepository dpRepository;
RechercheFournisseurQueryService rechercheFournisseur;
RechercheFactureQueryService rechercheFacture;
DateService dateService;
SFRepository sfRepository;
CommandeRepository commandeRepository;
RepartitionBudgetRepository repartRepo;
GenerateurRepartitionsDPService genRepartDpService;
SaisieRepartitionsSurDpQueryService saisieRepartitionsSurDpQueryService;
ImputationBudgetaireService imputationBudgetaireService;
NomenclatureService nomenclatureService;
ComptaGeneraleService comptaGeneraleService;
OperationInfoService operationInfoService;
DemandePaiementCalculateurService dpCalculateurService;
CodeMarcheAnnualiseRepository codeMarcheAnnualiseRepository;
DemandePaiementLigneFactory dpLigneFactory;
EcritureRepository ecritureRepository;
BrouillardNonViseRepository brouillardNonViseRepository;
使用构造函数注入非常可怕,非常烦人。有一些存储库(我认为太多了,DP 服务只需要存储库公开的方法的子集),一些服务(目前我的域无法真正拥有的计算)。
我需要稍微解释一下有关域的信息。 这个类负责附加到“DP”概念的所有用例(20 个方法,其中一些方法只是另一种不同的风格)。该概念位于“工作流程”的末尾(此处使用松散的术语):
- 首先用户创建一个“EJ”
- 然后他创建了一个“SF”
- 然后他创建了“Facture”
- 最后,他创建了一个 DP,它将预置对象绑定在一起,因此我们需要检查/加载预置对象之一的某些用例。一个 DP 不能真正保存所有的 previsous 对象(数据有点太多)。
想法:
- 我可以拆分用例(为每个子功能创建嵌套包)以限制依赖项的数量。
- 我可以重构模型
- 该类可以提供它需要的接口(在 Bob 叔叔关于 tdd / little architecture 的演讲之后,我正在研究这个想法)
任何优点/缺点/想法?
非常感谢您的时间/回答。
【问题讨论】:
-
具有如此多依赖关系的应用程序服务可能意味着它提供的服务不是高度内聚的,而且它可能做得太多。您应该至少给出该服务的接口及其所需的依赖项的示例,以便我们可以尝试向您展示正确的方向。另一个减少服务数量的想法是找到新的内聚概念,这些概念将组合一些依赖项并进行一些最初直接在应用程序服务上进行的操作。
-
+1,服务看起来很臃肿。仅仅因为某些活动在您的业务领域中形成了一个高级“工作流”,通常并不意味着所有活动都应该在同一个应用程序服务中。应用服务通常更符合聚合。
标签: unit-testing tdd domain-driven-design