0

MySQL 5.5 データベースで Hibernate 4.0.1.Final を使用しています。私は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 テーブルへの挿入は行われないと思います。1 対 1 で保存更新カスケード オプションを追加すると、ドメインと組織の両方が問題なく期待どおりに保存されることが期待されます。

私が見ることができる唯一の問題は、親ドメインがデータベースに存在しないため、組織を保存しようとした場合です。しかし、とにかくそれをしたくないでしょう。

テスト用に別の DB を維持し、DBUnit のようなものを使用して各テスト実行のデータをセットアップすることをお勧めします。

http://www.dbunit.org/

私は通常、Spring のトランザクション テスト サポートと Hibernate の DDL 値を使用して「作成」し、スキーマが変更されるたびにテスト データベースが自動的に更新されるようにします。

于 2012-07-14T18:34:00.940 に答える