我想模拟一个类似于的DAO管理器
public class DaoManager{
@Autowired
private Service1 service;
@Autowired
private Service2 service 2;
@Autowired
private DAOManager1 manager 1;
public CustomerDetail getCustomerDetails(){
manager1.getCustomerDetails();
}
public class DaoManager1{
@Autowired
private Service3 service3;
@Autowired
private Service4 service 4;
public getCustomerDetails(){
Service3.getCustName();
Service4.getCustAddress();
}
我的问题是如何嘲笑DaoManager类?如果我模拟它,我需要模拟从getCustomerDetails方法调用的每个管理器/服务?这对我来说是一笔巨大的开销。有什么想法吗?我完全搞错了?
编辑:
当我运行我的junit时,我会出现以下错误。
原因:org.springframework.beans.factory.BeanCreationException:创建名为"mockDaoManager"的bean时出错:注入自动连接的依赖项失败;嵌套异常为org.springframework.beans.factory.BeanCreationException:无法自动连接字段:private x.y.z.Service2 x.y.z_Service2;嵌套异常为org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型[x.y.z.Service2]的匹配bean:应至少有1个bean符合此依赖项的自动连线候选条件。依赖注释:{@org.springframework.beans.factory.annotation.Autowired(required=true)}
您必须在接口中获得DaoManager合约,并模拟最后一个
Interface IDaoManager {
CustomerDetail getCustomerDetails();
}
public class DaoManager implements IDaoManager
然后按照nsanglar的建议
IDaoManager daoManagerMock = mock(IDaoManager.class);
[...]
当然,您必须使用dao的接口来注入dao,无论如何,这是一个很好的做法
实际上,你只需要模拟对象的行为,所以基本上你可以定义你期望对象做什么,而不必考虑它的实现。在您的情况下,当嘲笑DaoManager时,例如,您可以在测试设置中写道:
DaoManager daoManagerMock = mock(DaoManager .class);
when(daoManagerMock .getCustomerDetails()).thenReturn(...);
因此,为了回答您的问题,您不必嘲笑您的dao所依赖的每一个服务/经理。