Wrapper-类 用于单元测试
Wrapper-Classes for Unit-Tests
我可以编写一些单元测试并进行重构。我们正在使用 Hybris。您经常看到的是 Trainwrecks。例如:cmsSiteService.getCurrentSite().getSlaveSalesOrganization()
等。
现在编写单元测试并模拟响应,在这种情况下,我将首先模拟 CurrentSite 并声明 doReturn(currentSite).when(cmsSiteService.getCurrentSite)
,然后声明 doReturn(slaveSalesOrganization).when(currentSite).getSlaveSalesOrganization()
。
这个例子很短,但是对于 cmsSiteService,它会在整个项目中发生。由于 cmsSiteService 是第三方 Hybris class,我认为最好编写一个 wrapper-class 来继承 CMSSiteService-Class 的所有内容。我可以在那里编写一个方法 getSlaveSalesOrganizationFromCurrentSite(CMSSiteService cmsSiteService) ,我会在其中调用上面的所有内容。
这是推荐的还是有更好的设计方案?
听起来您的方向是正确的。您正在做的是重构您的代码以更好地遵守 Law of Demeter,也称为 "principle of least knowledge"。像你说的那样挖掘对象链是一种反模式,这正是你遇到的原因:当对象紧密耦合时,它们很难修改和测试。
理想情况下,如果您被允许修改该代码,您会向 CMSSiteService
class 添加一个 getSlaveSalesOrganizationFromCurrentSite
方法。我认为创建一个包装器来简化一个丑陋的界面是一个很好的第二个选择。那将是 Adapter pattern 的一个实现。这是防止您自己的代码与(其他人的)蹩脚代码紧密耦合的好方法。
我可以编写一些单元测试并进行重构。我们正在使用 Hybris。您经常看到的是 Trainwrecks。例如:cmsSiteService.getCurrentSite().getSlaveSalesOrganization()
等。
现在编写单元测试并模拟响应,在这种情况下,我将首先模拟 CurrentSite 并声明 doReturn(currentSite).when(cmsSiteService.getCurrentSite)
,然后声明 doReturn(slaveSalesOrganization).when(currentSite).getSlaveSalesOrganization()
。
这个例子很短,但是对于 cmsSiteService,它会在整个项目中发生。由于 cmsSiteService 是第三方 Hybris class,我认为最好编写一个 wrapper-class 来继承 CMSSiteService-Class 的所有内容。我可以在那里编写一个方法 getSlaveSalesOrganizationFromCurrentSite(CMSSiteService cmsSiteService) ,我会在其中调用上面的所有内容。
这是推荐的还是有更好的设计方案?
听起来您的方向是正确的。您正在做的是重构您的代码以更好地遵守 Law of Demeter,也称为 "principle of least knowledge"。像你说的那样挖掘对象链是一种反模式,这正是你遇到的原因:当对象紧密耦合时,它们很难修改和测试。
理想情况下,如果您被允许修改该代码,您会向 CMSSiteService
class 添加一个 getSlaveSalesOrganizationFromCurrentSite
方法。我认为创建一个包装器来简化一个丑陋的界面是一个很好的第二个选择。那将是 Adapter pattern 的一个实现。这是防止您自己的代码与(其他人的)蹩脚代码紧密耦合的好方法。