我正在使用具有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,我认为它可以提高可测试性和可读性。但是对于调用此方法/服务,表示层必须调用持久层以构建供应商。这不好,对吗?我不应该重构代码,并进行模拟测试吗?
答案 0 :(得分:0)
如果以这种方式进行重构,则意味着DomainServiceA
不再是服务,而是将DTO列表映射到域对象列表的映射器,因为您在方法中传递了DTO并返回域对象。
它改变了该方法的总体意图。
不是getListDomainA()
,而是toListDomain()
。
所以我不再需要模拟dao,我认为它会增加 可证明性和可读性。但要调用此方法/服务
被调用的DAO的逻辑仍然存在,但是它在上一层,您还应该对其进行测试。因此,它只是将问题转移到其他地方,并且使您的设计不清楚:由于服务层存在,表示层不应与存储库层进行通信,但它确实可以。
模拟DAO /存储库是正常的事情,您想模拟它们以测试调用它的服务的核心逻辑,并确保按原样调用该方法。
如果您想将单元测试的重点放在DTO域映射上,则可以引入一个接受DTO列表的Mapper类,并使服务调用它。这样,不需要模拟就可以测试Mapper类。