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。。整个应用程序都将受益