Java 单元测试Hibernate POJO

Java 单元测试Hibernate POJO,java,unit-testing,hibernate,Java,Unit Testing,Hibernate,我有一个hibernate POJO,我想进行单元测试。它看起来像这样: public class MyPojo{ private final Integer someIntData; private MyPojo(){ //Just to satisfy compiler, hibernate will override someIntData = null; } //Methods etc... } 我想对这个类进行单元测试

我有一个hibernate POJO,我想进行单元测试。它看起来像这样:

public class MyPojo{
    private final Integer someIntData;

    private MyPojo(){
        //Just to satisfy compiler, hibernate will override
        someIntData = null;
    }

   //Methods etc...
}

我想对这个类进行单元测试,但并不想创建一个新的构造函数来手动设置“someIntData”。有没有一种简单快捷的方法可以让hibernate实例化MyPojo的测试实例而不必使用模拟数据库?

我的建议很难看,但我认为最好的方法不是使用hibernate进行单元测试,而是使用反射来实例化对象(hibernate内部就是这样做的)。比如说

      Constructor[] cons = MyPojo.class.getDeclaredConstructors();
      // Change the accessible property of the constructor.
      cons[0].setAccessible(true);
      MyPojo secret = (MyPojo)cons[0].newInstance(null);
代码取自


我记得读到过一些框架,它们使单元测试更容易使用反射,但我从未使用过它们。在这种情况下,我总是倾向于创建第二个构造函数,或者使构造函数包受到保护。

我要建议的是丑陋的,但我认为最好的方法是不要在单元测试中使用hibernate,而使用反射来实例化对象(hibernate内部就是这样做的)。比如说

      Constructor[] cons = MyPojo.class.getDeclaredConstructors();
      // Change the accessible property of the constructor.
      cons[0].setAccessible(true);
      MyPojo secret = (MyPojo)cons[0].newInstance(null);
代码取自


我记得读到过一些框架,它们使单元测试更容易使用反射,但我从未使用过它们。在这种情况下,我总是倾向于创建第二个构造函数或使构造函数包受到保护。

如果这是一个真正的单元测试,您不需要依赖Hibernate

为了能够对类进行单元测试,通常会更改方法的可见性,甚至引入一些方法。我不介意使用一个带有整数作为参数的公共构造函数来对POJO进行单元测试


在测试服务时,您当然需要能够在POJO中设置ID。例如,如果您想测试
myService(mypojop)
调用
myDAO.findFoos(p.getId())
,那么您的POJO中需要一个ID。

如果这是一个真正的单元测试,您不应该依赖Hibernate

为了能够对类进行单元测试,通常会更改方法的可见性,甚至引入一些方法。我不介意使用一个带有整数作为参数的公共构造函数来对POJO进行单元测试


在测试服务时,您当然需要能够在POJO中设置ID。例如,如果您想测试
myService(MyPOJO p)
调用
myDAO.findFoos(p.getId())
,那么您的POJO中需要一个ID。

私有构造函数意味着您要么提供了一个“builder”方法来替换构造函数(通常用于不可变实例),要么根本就不需要初始化该类。在后一种情况下,这通常是因为该类是一个单实例,您需要提供一个返回单实例的方法

Hibernate并不抱怨它,因为它使用反射来使用这个构造函数。由于您不应该为测试提供特殊代码,所以我看到的唯一解决方案是使用反射来实例化新的POJO


但我真的认为您应该重新考虑并提供一个生成器方法,接受构建新实例所需的参数

私有构造函数意味着您要么提供一个“builder”方法来替换构造函数(通常用于不可变实例),要么根本不打算初始化该类。在后一种情况下,这通常是因为该类是一个单实例,您需要提供一个返回单实例的方法

Hibernate并不抱怨它,因为它使用反射来使用这个构造函数。由于您不应该为测试提供特殊代码,所以我看到的唯一解决方案是使用反射来实例化新的POJO


但我真的认为您应该重新考虑并提供一个生成器方法,接受构建新实例所需的参数

是的,hibernate似乎工作得很好,只需将值插入最后的字段。我将构造函数设置为私有,只是为了阻止编译器抱怨它们没有初始化,并防止直接实例化。但是现在我想进行测试,以某种方式让hibernate成为我的测试实例。是的,hibernate似乎工作得很好,只需将值插入最后的字段中。我将构造函数设置为私有,只是为了阻止编译器抱怨它们没有初始化,并防止直接实例化。但现在我想进行测试,以某种方式让hibernate生成我的测试实例。