我对Java相当陌生,我加入了一个利用DDD模式(据说)的项目。我来自强大的python背景,对单元测试驱动的设计相当深入。也就是说,迁移到Java的挑战之一是服务层的可测试性。
我们的REST类项目堆栈如下所示:
ServiceHandlers,它处理请求/响应等,并调用IService的特定实现(例如。DocumentService)DocumentService --使用makeOwner(session, user, doc)等方法处理审核、权限检查等。目前,类似于DocumentService的东西有通过guice注入存储库依赖项。在像DocumentService.makeOwner这样的公共方法中,我们希望确保会话用户是管理员,并检查目标用户是否已经是所有者(利用注入的存储库)。这就产生了一些欺骗代码--一个用于解决用户问题并确保成员资格、权限等的两个用户。为了消除这些冗余代码,我想要进行一种超级简单的isOwner(user, doc)调用,可以简洁地模拟各种测试场景(例如,当用户无法解析时抛出异常等)。这是我搜索失败的地方。
如果我将它放在与DocumentService相同的类中,那么在同一个类中测试makeOwner时(由于Mockito的限制),我不能模拟它,尽管它感觉应该放在这里(option1)。
如果我把它放在像DocumentHelpers这样的低级类中,感觉有点滑稽,但我可以轻松地模仿它。此外,DocumentHelpers还需要注入存储库,这在guice中是很好的。(备选案文2)
我要补充的是,在我们的幼稚代码库中有许多这样的点是不可测试的,因为方法不是静态地调用相同的* ServiceHandler类中没有使用的类似助手的方法。然而,在这个阶段,我不知道这是糟糕的设计还是仅仅是好的。
因此,我询问更有经验的Java开发人员:
增加3位bits:
如有任何指导,将不胜感激。
发布于 2016-11-18 10:00:58
启动该操作的用户必须是管理员,这与应用程序级别的访问控制关注点类似。DDD对你应该怎么做没有太多的意见。对于可测试性和关注点分离的目的,拥有某种独立的非静态类可能比在同一服务中的方法或静态助手更好。
检查未来的主人是否已经是主人(如果我正确理解的话)可能是另一种动物。它可能是您域中的不变量。如果是这样的话,最好的方法是依靠聚合来强制执行该规则。但是,从您的描述中还不清楚Document是否是一个聚合,以及它或其他聚合是否包含判断用户是否为所有者所需的数据。
或者,您可以在应用程序层级别验证规则,但这意味着如果状态更改是由应用程序层以外的其他东西触发的,则域模型可能会变得不一致。
发布于 2016-12-04 01:08:14
随着我更多地了解DDD,我的问题似乎并不完全是DDD相关的,而且更多的是关于代码结构和层间交互的一般层次结构。最后,我们使用了一个可以模拟的单独的DocumentServiceHelpers类。这包含像isOwner这样的方法,我们可以模拟这些方法,根据需要返回true或false,以便更容易地测试我们的DocumentService处理。感谢大家的配合。
https://stackoverflow.com/questions/40667370
复制相似问题