[英]Unit testing Hibernate POJO
我有一个要进行单元测试的休眠POJO。 它看起来类似于:
public class MyPojo{
private final Integer someIntData;
private MyPojo(){
//Just to satisfy compiler, hibernate will override
someIntData = null;
}
//Methods etc...
}
我想对此类进行单元测试,但实际上并不想创建一个新的构造函数,而只是手动设置“ someIntData”。 有没有一种快速简便的方法来使休眠实例化MyPojo的测试实例而无需模拟数据库呢?
我要建议的是丑陋的,但我认为最好的方法是不要将休眠用于单元测试,而应使用反射实例化对象(这是休眠在内部进行的操作)。 例如
Constructor[] cons = MyPojo.class.getDeclaredConstructors();
// Change the accessible property of the constructor.
cons[0].setAccessible(true);
MyPojo secret = (MyPojo)cons[0].newInstance(null);
代码摘自http://dunwood.blogspot.com/2004/05/instantiate-java-class-that-has.html
我记得读过一些框架,这些框架使使用反射更易于进行单元测试,但是我从未使用过它们。 在这种情况下,我总是喜欢创建第二个构造函数或使构造函数包受到保护。
如果这是一个真实的单元测试,则无需依赖Hibernate。
更改方法的可见性,甚至引入一些方法以便能够对类进行单元测试是很常见的。 为了单元测试POJO,我不介意使用带有Integer作为参数的公共构造函数。
无论如何,在测试服务时,您肯定需要能够在POJO中设置ID。 例如,如果要测试myService(MyPOJO p)
调用myDAO.findFoos(p.getId())
,则在POJO中需要一个ID。
私有构造函数意味着您正在提供一个“ builder”方法来替换该构造函数(通常用于不可变的实例),或者该类永远都不打算初始化。 在后一种情况下,通常是因为该类是单例,并且您将提供一个返回单个实例的方法。
Hibernate对此并不抱怨,因为它使用反射来消耗此构造函数。 由于您不应该为测试提供特殊代码,因此我看到的唯一解决方案是使用反射实例化一个新的POJO。
但是我真的认为您应该重新考虑并提供一个生成器方法,接受构建新实例所需的参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.