【问题标题】:Unit testing Hibernate POJO单元测试 Hibernate POJO
【发布时间】:2011-03-11 10:42:22
【问题描述】:

我有一个要进行单元测试的休眠 POJO。它看起来像这样:

public class MyPojo{
    private final Integer someIntData;

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

   //Methods etc...
}

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

【问题讨论】:

  • 是的,休眠似乎工作正常,只需将值插入最终字段。我将构造函数设为私有只是为了阻止编译器抱怨它们没有初始化,并防止直接实例化。但现在我想测试,以某种方式让我的测试实例休眠。

标签: java unit-testing hibernate


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我要建议的是丑陋的,但我认为最好的方法是不要使用 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);
    

    代码取自http://dunwood.blogspot.com/2004/05/instantiate-java-class-that-has.html

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

    【讨论】:

      【解决方案3】:

      如果是真正的单元测试,则不需要依赖 Hibernate。

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

      无论如何,当您要测试服务时,您肯定需要能够在 POJO 中设置 ID。例如,如果您想测试 myService(MyPOJO p)calls myDAO.findFoos(p.getId()),则您的 POJO 中需要一个 ID。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多