覆盖生成的id

时间:2017-06-15 19:15:49

标签: java spring hibernate

我为Spring Application编写集成测试。

为了测试我使用Spock Framework。

问题是我想在每次测试之前保存2个对象,并且我想在每次测试后删除所有对象。

当我为id 1和2调用测试方法findById时,我得到了这些对象。 但是当我再次为id 1和2调用findById测试时,我会得到id为3和4的对象。

我使用的id的Hibernate策略是:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)

问题是如何测试它或如何强制休眠不创建新标识符?

2 个答案:

答案 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的更多信息。