2012-07-13 73 views
0

我正在使用Hibernate 4.0.1.Final與MySQL 5.5數據庫。我正在編寫一個Java控制檯應用程序。在JUnit測試中,我無法使測試失敗。這裏是我的測試車型...無法獲得Hibernate JUnit測試來生成約束異常

@Entity 
@Table(name = "ic_domain") 
public class Domain { 

    @Id 
    @Column(name = "DOMAIN_ID") 
    private String domainId; 

    @OneToOne(fetch = FetchType.EAGER, targetEntity = Organization.class) 
    @JoinColumn(name = "ORGANIZATION_ID") 
    private Organization org; 

@Entity 
@Table(name = "ic_organization") 
public class Organization { 

    @Id 
    @Column(name = "ORGANIZATION_ID") 
    private String organizationId; 

我的問題是,在我的JUnit測試,我試圖創建一個不存在的外鍵,期待的事情時失敗節約,但他們從不這樣做。下面是JUnit測試

@Test 
public void testSaveDomainWithUnmathcedOrg() { 
    final Organization org = createDummyOrg(); 
    // Create an org id that doesn't exist. 
    org.setOrganizationId("ZZZZ"); 
    final Domain domain = new Domain(); 
    final String id = UUID.randomUUID().toString().replace("-", ""); 
    domain.setDomainId(id); 
    domain.setName(org.getName()); 
    domain.setOrg(org); 
    m_domainDao.saveOrUpdate(domain); 
} // testSaveDomainWithUnmatchedOrg 

的DAO的代碼是

public void saveOrUpdate(final Domain domain) { 
    final Session session = sessionFactory.getCurrentSession(); 
    session.saveOrUpdate(obj); 
} // saveOrUpdate 

不應該的事情不能在 「session.saveOrUpdate」?我如何製作它們?我不想在JUnit測試中提交數據,因爲我不想用虛擬數據污染底層數據庫,但如果這是唯一的方法,那就這樣吧。

回答

1

你沒有犯,但你需要刷新會話觸發SQL語句的執行:

m_domainDao.saveOrUpdate(domain);  
sessionFactory.getCurrentSession().flush(); 

然後你就可以回滾事務,如果你不想污染數據庫。

0

你爲什麼期望事情失敗?

您創建一個新的域並保存它。應該按預期工作。

域具有映射到組織。您還沒有聲明任何@Cascade選項,因此我猜想沒有對組織表進行插入。在一對一的情況下添加保存更新級聯選項,我期望域和組織都按預期保存,沒有問題。

我只能看到的問題是,如果您嘗試保存組織,因爲父域不在數據庫中。但是,那麼你不想那麼做。

我會建議維護一個單獨的數據庫進行測試,並使用類似DBUnit的設置爲每個測試運行設置數據。

http://www.dbunit.org/

我通常使用這種與Spring的事務性測試的支持和Hibernate的DDL值到「創造」,以便測試數據庫自動每次架構更改更新。