繁体   English   中英

单元测试Hibernate POJO

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM