(java)我应该/如何重构此代码?
我正在开发一个具有n层体系结构的旧应用程序。我有这样的域服务:(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
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这里不应该问这样的问题是的,你不应该重构代码,这很好。