我想模拟一个像这样的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方法调用的每个管理器/服务? 对我来说这看起来很重要。任何想法或mebbe我完全弄错了?
编辑:
当我运行我的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:期望至少有一个bean可以作为此依赖项的autowire候选者。依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}
答案 0 :(得分:1)
实际上你只需要模拟对象的行为,所以基本上你定义了你期望对象将要做什么,而不必考虑它的实现。在您的情况下,在模拟DaoManager时,您可以在测试设置中写入:
DaoManager daoManagerMock = mock(DaoManager .class);
when(daoManagerMock .getCustomerDetails()).thenReturn(...);
所以要回答你的问题,你不必嘲笑你的dao所依赖的每一个服务/经理。
答案 1 :(得分:1)
你必须在界面中获得DaoManager合约并模拟最后一次
Interface IDaoManager {
CustomerDetail getCustomerDetails();
}
public class DaoManager implements IDaoManager
然后按照nsanglar建议
IDaoManager daoManagerMock = mock(IDaoManager.class);
[...]
当然你必须使用它的界面注入dao,无论如何,这是一个很好的做法