2017-06-15 97 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