2017-06-15 68 views
0

我为Spring应用程序编写集成测试。覆盖生成的ID

对于测试我使用Spock框架。

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

当我调用测试方法findById为id 1和2我得到这些对象。 但是当我再次findById测试呼吁ID 1和2我取得编号为3和4的对象

休眠策略ID我用的是:

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 

,问题是我怎么能测试或者我如何强制hibernate不创建新的标识符?

回答

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... 
    } 
} 

我会避免广泛修改您的生产代码只是为了使测试更容易。对于大多数问题通常都有很好的解决方案。

+0

是的,我的设置看起来像这样,但我使用@Before – user

+0

好吧......但您确实有保存的实体,并且您确实拥有该ID。那么问题是什么? –

+0

当第一次测试运行时,我有db 2对象与id 1和2.如果我为1和2调用findById我得到成功测试,因为在这个时间在db中的实体具有这些id。但是,当下一次测试运行在分贝我有2个对象,但与id 3和4,测试失败。 – user

0

你不能这样做 - 这些ID不是由Hibernate生成的,而是由你的数据库生成的(在本例中)。当hibernate插入时,数据库增加其计数器。如果不重新创建表,这不能撤销。

如果您希望手动分配ID,则必须使用不同的策略 - 例如, assigned(它不是JPA的一部分,但存在于Hibernate中)。尽管这也会影响您的生产代码,而您也不想这样做。

相反,你不应该依赖于硬编码的标识 - 您可以从实体本身让他们:

Blah b = dao.save(Blah.random(); 
    flushAndClear(); 
    Blah fromDB = dao.findById(b.getId); 

您可以阅读更多关于如何写DAO层测试here