Unit testing 模拟Hibernate事务性DAO

Unit testing 模拟Hibernate事务性DAO,unit-testing,mocking,mockito,Unit Testing,Mocking,Mockito,我无法模拟TransactionalDao中的任何方法 注意:-T是我的实体类 代码流是这样的 public class MainClassImpl extends TransactionalDao<T> implements MainClass{ public Set<T> method1(Set<T> setOfTypeT){ return super.addOrUpdate(setOfTypeT); } }

我无法模拟
TransactionalDao
中的任何方法

注意:-T是我的实体类

代码流是这样的

public class MainClassImpl extends TransactionalDao<T> implements MainClass{

     public Set<T> method1(Set<T> setOfTypeT){
            return super.addOrUpdate(setOfTypeT);
     }
}
public类mainclassmpl扩展事务性类MainClass{
公共集合方法1(集合类型集合){
返回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);  
      }
}
public类mainclastest{
@试验
公共无效方法1测试(){
MainClassImpl spy=Mockito.spy(新的MainClassImpl());
Set setTest=新的HashSet();
Mockito.doReturn(setTest).when((事务DAO)spy).addOrUpdate(setTest);
spy.addOrUpdateDeviceDetails(setTest);
}
}
当我在调试模式下运行它时,它正在调用
TransactionalDao
并试图执行它。
我们怎样才能模仿事务性dao呢?

我认为你不能在Mockito中模仿这样的行为

我建议如下(按顺序):

1)如果不重写addOrUpdate方法,则从方法调用中删除超级前缀,Mockito将模拟该方法:

public Set<T> method1(Set<T> setOfTypeT){
        return addOrUpdate(setOfTypeT);
}
公共集合方法1(集合类型){
返回addOrUpdate(setOfTypeT);
}
2)不确定是什么促使您使用Dao类实际扩展服务类。我认为你应该选择作文。当您将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类mainclassmpl扩展事务性类MainClass{
公共集合方法1(集合类型集合){
返回baseAddOrUpdate(setOfTypeT);
}
公共集合baseAddOrUpdate(集合类型集合){
返回super.addOrUpdate(setOfTypeT);
}
}
试验

public类mainclastest{
@试验
公共无效方法1测试(){
MainClassImpl spy=Mockito.spy(新的MainClassImpl());
Set setTest=新的HashSet();
Mockito.doReturn(setTest).when(spy).baseAddOrUpdate(setTest);
spy.addOrUpdateDeviceDetails(setTest);
}
}

底线是,如果这不是您无法触及的旧遗留代码,那么选择选项2。。整个应用程序都将受益。

我认为你不能在Mockito中模仿这种行为

我建议如下(按顺序):

1)如果不重写addOrUpdate方法,则从方法调用中删除超级前缀,Mockito将模拟该方法:

public Set<T> method1(Set<T> setOfTypeT){
        return addOrUpdate(setOfTypeT);
}
公共集合方法1(集合类型){
返回addOrUpdate(setOfTypeT);
}
2)不确定是什么促使您使用Dao类实际扩展服务类。我认为你应该选择作文。当您将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类mainclassmpl扩展事务性类MainClass{
公共集合方法1(集合类型集合){
返回baseAddOrUpdate(setOfTypeT);
}
公共集合baseAddOrUpdate(集合类型集合){
返回super.addOrUpdate(setOfTypeT);
}
}
试验

public类mainclastest{
@试验
公共无效方法1测试(){
MainClassImpl spy=Mockito.spy(新的MainClassImpl());
Set setTest=新的HashSet();
Mockito.doReturn(setTest).when(spy).baseAddOrUpdate(setTest);
spy.addOrUpdateDeviceDetails(setTest);
}
}
底线是,如果这不是您无法触及的旧遗留代码,那么选择选项2。。整个应用程序都将受益