我无法模拟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
?
我不认为您可以在Mockito中模拟这种行为。
我会建议以下(按此顺序):
1)如果不覆盖addorupdate方法,则从方法调用中删除超级前缀,那么Mockito将模拟该方法:
public Set<T> method1(Set<T> setOfTypeT){
return 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 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。整个应用程序将受益。