使用实体的存根版本测试Hibernate

时间:2018-08-02 15:21:48

标签: java spring hibernate unit-testing integration-testing

我对对象和实体有一个比较复杂,相互交织的数据结构,对此我无能为力。但是,我想为每个随附的DAO编写测试。但是,为此,我需要为每个测试设置Hibernate。

假设我们正在尝试测试PersonDAO,其中Person对象连接到其他映射的实体,并且看起来像这样:

Person
|-> Car
|   |-> Window
|   |-> Tyre
|   |-> Engine
|   |   `-> ...
|   |-> Insurance
`-> House
    |-> Window
    |-> Insurance
    `-> Family
        `-> Person

以上组合有些武断。以上每个对象都映射到包含.hbm.xml个文件的表中。它们也可以使用“注释”进行映射,但是我会讲到这一点。

// Create the connection to the database.
Configuration configuration = new Configuration().configure(PersonDAOTest.class.getResource("/hibernate.cfg.xml"));
configuration.addClass(Person.class);
configuration.addClass(Car.class);
// ...

要测试Person,我们还需要告诉Hibernate关于Car和House的存在。但是,对于每个对象,我们都需要它们相关的实体:车窗,轮胎,保险等。这是我要避免的部分。尽管上面的示例很简单,但是这将导致我包含大量与测试无关的类列表。

我理想的情况是希望能够给Hibernate一个伪造的/模拟的类,以便Hibernate看到以下内容:

Person
|-> Car
`-> House

可能性一:“覆盖”课程

最简单的解决方案是在我的测试包中创建Car和House类。 PersonDAOTest找到这些类并将它们传递给Hibernate。休眠状态很满意。

问题很明显:我包中的每个测试类都不再能找到原始的Car类。我正在测试错误的对象。基本上无论如何都需要实现他们的所有方法。刚刚。

可能性二:覆盖休眠映射

在我的测试包中,我创建了Car.hbm.xml和House.hbm.xml的简化版本,而Hibernate则选择了该版本。

虽然这确实可行,但主要的问题是,如果我想测试Car或House,我将不再能够。或者,如果我想在某个时候嘲笑Person,伪造的Person.hbm.xml版本将阻止我的测试正常工作。

第二个问题是,将来将不可能转向注释。

可能性三:该类的private批注版本

这会将Car的存根版本保留在测试本身中。不幸的是,实体需要公开。据我所知,这是行不通的。

此外,在使用它们的每个测试中都需要复制模拟的类。

可能性四:扩展它们?

我曾尝试用带注释的FakedCar扩展Car,但是Hibernate确实需要Person.hbm.xml中引用的原始版本。

对于如何为Hibernate提供映射类的存根版本,还有其他解决方案或建议吗?

0 个答案:

没有答案