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

(java)我应该/如何重构此代码?,java,refactoring,Java,Refactoring,我正在开发一个具有n层体系结构的旧应用程序。我有这样的域服务: public Class DomainServiceA{ //inject private ObjectADao adao; private ParamDao pdao; //others dao needed public List<DomainObjectA> getListDomainA(){ List<DtoA> listDto

我正在开发一个具有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

}
公共类域服务a{
//注入
私人反对阿多阿多;
私营机构;;
//其他需要的
公共列表getListDomainA(){
List listDto=adao.getListaDto();
Param someparam=pdao.getParamA();
//将listDto更改为listDomainObject的一些代码
返回listDomainObject;
}
//一些Ohter服务方法
}
为了测试这个方法,我需要模拟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

}
公共类域服务a{
公共列表getListDomainA(供应商列表TO,参数someparam){
//将listDto更改为listDomainObject的一些代码
返回listDomainObject;
}
//一些Ohter服务方法
}

所以我不再需要模拟DAO,我认为它增加了可测试性和可读性。但是为了调用这个方法/服务,表示层必须调用持久层来构建供应商。这很糟糕,对吧?我是否应该重构代码,并使用mock进行测试?

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

所以我不再需要模拟DAO了,我想它会增加 可测试性和可读性。但是调用此方法/服务

被调用的DAO的逻辑仍然存在,但它位于上面的层上,您还应该测试它。因此,它只是将问题转移到其他地方使您的设计变得不清晰:表示层不应该与存储库层通信,因为服务层存在,但它确实存在

模拟DAO/repositories是一件正常的事情,您希望模拟它们来测试调用它的服务的核心逻辑,并确保方法按其应该的方式被调用。

如果您想将单元测试的重点放在DTO域映射上,那么可以引入一个Mapper类,该类接受DTO列表并让服务调用它。通过这种方式,不需要模拟来测试映射器类

@ilumin这里不应该问这样的问题是的,你不应该重构代码,这很好。