我对对象和实体有一个比较复杂,相互交织的数据结构,对此我无能为力。但是,我想为每个随附的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提供映射类的存根版本,还有其他解决方案或建议吗?