(java)应该/如何重构此代码?

时间:2018-08-20 11:19:44

标签: java refactoring

我正在使用具有n层体系结构的旧应用程序。我有这样的域服务:

public Class DomainServiceA{

     //inject
     private ObjectADao adao;
     private ParamDao pdao;
     //others dao needed

     public List<DomainObjectA> getListDomainA(){
          List<DtoA> listDto = adao.getListaDto();
          Param someparam = pdao.getParamA();
          //some code to change listDto to listDomainObject
          return listDomainObject;
     }

     //some ohters services methodes

}

为了测试此方法,我需要模拟DAO和此方法中使用的方法。我想重构这段代码

public Class DomainServiceA{

     public List<DomainObjectA> getListDomainA(Supplier<List<DtoA>> listDto, Param someparam){
          //some code to change listDto to listDomainObject
          return listDomainObject;
     }

     //some ohters services methodes

}

因此,我不再需要模拟dao,我认为它可以提高可测试性和可读性。但是对于调用此方法/服务,表示层必须调用持久层以构建供应商。这不好,对吗?我不应该重构代码,并进行模拟测试吗?

1 个答案:

答案 0 :(得分:0)

如果以这种方式进行重构,则意味着DomainServiceA不再是服务,而是将DTO列表映射到域对象列表的映射器,因为您在方法中传递了DTO并返回域对象。
它改变了该方法的总体意图。 不是getListDomainA(),而是toListDomain()

  

所以我不再需要模拟dao,我认为它会增加   可证明性和可读性。但要调用此方法/服务

被调用的DAO的逻辑仍然存在,但是它在上一层,您还应该对其进行测试。因此,它只是将问题转移到其他地方,并且使您的设计不清楚:由于服务层存在,表示层不应与存储库层进行通信,但它确实可以。

模拟DAO /存储库是正常的事情,您想模拟它们以测试调用它的服务的核心逻辑,并确保按原样调用该方法。
如果您想将单元测试的重点放在DTO域映射上,则可以引入一个接受DTO列表的Mapper类,并使服务调用它。这样,不需要模拟就可以测试Mapper类。