2017-02-23 80 views
1

我无法嘲笑从TransactionalDao任何方法。模拟休眠transactionalDao

注意: - T是我的实体类。

代码流是这样的。

public class MainClassImpl extends TransactionalDao<T> implements MainClass{ 

    public Set<T> method1(Set<T> setOfTypeT){ 
      return super.addOrUpdate(setOfTypeT); 
    } 
} 

我的测试类:

public class MainClassTest{ 
     @Test 
     public void method1Test(){ 
      MainClassImpl spy= Mockito.spy(new MainClassImpl()); 

      Set<T> setTest= new HashSet<T>(); 
      Mockito.doReturn(setTest).when((TransactionalDao<T>)spy).addOrUpdate(setTest); 

      spy.addOrUpdateDeviceDetails(setTest); 
     } 
} 

当我运行在调试模式下它被调用TransactionalDao并试图执行它。 我们该如何模拟TransactionalDao

回答

0

我不认为你可以在Mockito中嘲笑这种行为。

我会建议如下(按顺序):

1)如果你不重写addOrUpdate方法,然后从方法调用super前缀,那么的Mockito会嘲笑这种方法:

public Set<T> method1(Set<T> setOfTypeT){ 
     return addOrUpdate(setOfTypeT); 
} 

2)不知道是什么促使你真正用Dao类扩展Service类。我认为你应该选择作曲。当你将Dao用作依赖时,那么嘲笑该方法不会再成为问题。

3)如果你不能去任何上述的,那么你会留下类似下面的一些定制的解决方法:

public class MainClassImpl extends TransactionalDao<T> implements MainClass{ 
public Set<T> method1(Set<T> setOfTypeT){ 
     return baseAddOrUpdate(setOfTypeT); 
} 

public Set<T> baseAddOrUpdate(Set<T> setOfTypeT){ 
    return super.addOrUpdate(setOfTypeT); 
} 
} 

测试

public class MainClassTest{ 
     @Test 
     public void method1Test(){ 
      MainClassImpl spy= Mockito.spy(new MainClassImpl()); 

      Set<T> setTest= new HashSet<T>(); 
      Mockito.doReturn(setTest).when(spy).baseAddOrUpdate(setTest); 

      spy.addOrUpdateDeviceDetails(setTest); 
     } 
} 

底线是,如果这不是一些旧的遗留代码,你不能触摸,然后去选择2 ..整个应用程序将受益。