如何使用Mockito复合对象

时间:2014-10-21 06:21:22

标签: java unit-testing mocking mockito junit4

我想模拟一个像这样的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)}

2 个答案:

答案 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,无论如何,这是一个很好的做法