0

我将 Hibernate 4.0.1.Final 与 MySQL 5.5 数据库一起使用。我正在编写一个 Java 控制台应用程序。在 JUnit 测试中,我无法让测试失败。这是我正在测试的模型……</p>

@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 测试中提交我的数据,因为我不想用虚拟数据污染底层数据库,但如果这是唯一的方法,那就这样吧。

4

2 回答 2

1

您不必提交,但需要刷新会话以触发 SQL 语句的执行:

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

然后如果不想污染数据库,可以回滚事务。

于 2012-07-13T15:27:43.933 回答
0

为什么你期望事情会失败?

您创建一个新域并保存它。应该按预期工作。

域具有到组织的映射。您没有声明任何 @Cascade 选项,所以我猜想没有对 Organization 表进行插入。在一对一上添加保存更新级联选项,我希望域和组织都按预期保存,没有问题。

我能看到的唯一问题是,如果您尝试将组织保存为数据库中不存在父域。但是,无论如何您都不想这样做。

我建议维护一个单独的数据库进行测试,并使用 DBUnit 之类的东西为每次测试运行设置数据。

http://www.dbunit.org/

我通常将它与 Spring 的事务测试支持和 Hibernate 的 DDL 值一起使用来“创建”,因此测试数据库会随着每次模式更改而自动更新。

于 2012-07-14T18:34:00.940 回答