我为Spring Application编写集成测试。
为了测试我使用Spock Framework。
问题是我想在每次测试之前保存2个对象,并且我想在每次测试后删除所有对象。
当我为id 1和2调用测试方法findById
时,我得到了这些对象。
但是当我再次为id 1和2调用findById
测试时,我会得到id为3和4的对象。
我使用的id的Hibernate策略是:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
问题是如何测试它或如何强制休眠不创建新标识符?
答案 0 :(得分:0)
您是否对此课程中的所有测试都有通用设置?如果是这样,你有没有想过:
class TestClass extends Specification {
def entity1 = null
def entity2 = null
def setup() {
entity1 = em.save(... your entity...)
entity2 = em.save(... your entity...)
}
def cleanup() {
em.delete(entity1)
em.delete(entity2)
}
def "some test"() {
// do your test stuff...
}
}
我会避免对您的生产代码进行大量修改,以使测试更容易。对于大多数问题,通常都有一个很好的解决方案。
答案 1 :(得分:0)
你不能这样做 - ID不是由Hibernate生成的,而是由(在这种情况下)由您的DB生成的。当hibernate INSERT时,数据库会递增其计数器。如果不重新创建表,则无法撤消此操作。
如果您希望手动分配ID,则必须使用其他策略 - 例如assigned
(它不是JPA的一部分,但存在于Hibernate中)。虽然这会影响您的生产代码,但您不想这样做。
相反,您不应该依赖硬编码ID - 您可以从实体本身获取它们:
Blah b = dao.save(Blah.random();
flushAndClear();
Blah fromDB = dao.findById(b.getId);
您可以阅读有关如何编写DAO层测试here的更多信息。