12

私はデータレイヤー統合テストにHSQLDBを使用しています。これは素晴らしいことです。ただし、外部キーの制約がテストの邪魔になっていることがわかりました。たとえば、1つのテーブルで単純な選択をテストするには、ダミーデータを5つの追加テーブルに挿入する必要があります。これは私が物を投げたくなります。

モデルコード全体にJPAアノテーションがあり、構成でスキーマ(hbm2ddl.create-drop)を再作成するようにHibernateを構成しました。テーブルが生成されるとき、結合は外部キー制約として正しく解釈されています。

私が欲しいのは次のいずれかです:

  1. 最初に外部キーを作成しない(理想的、最もクリーン)、または
  2. データベース内のすべての外部キーをプログラムで削除する方法を見つけてください(ちょっとハッキーですが、仕事は終わります)

それが役に立ったら、私はこれらのテストを自動配線するためにSpringを使用しています。問題のテストは、AbstractTransactionalJUnit4SpringContextTestsから継承されます。

どう思いますか?これはできますか?

4

5 に答える 5

11

次の手順でFK制約を非アクティブ化できます。

SET REFERENTIAL_INTEGRITY FALSE;

テストメソッドの前にJDBCを介して実行できStatementます(そして後に戻すことができますTRUE)。

于 2010-04-21T21:04:41.587 に答える
10

フラット xml データセットで DAO をテストしようとしているときに、まったく同じ問題が発生しました。構成はDBunit + HSQLDB 2.2.8 + JUnit4 + Spring + JPA->すべて一緒につながる

java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: foreign key no parent; FK13EE6CE6F09A6AAC table: ****

を拡張するリスナーを実装することで、良い回避策を見つけましたAbstractTestExecutionListener。各テストの前に実行するアクションのタイプを指定します。この場合は、外部キー制約を無効にします。 注: 構文は、使用する HSQLDB のバージョンによって異なる場合があります。

public class ForeignKeyDisabling extends AbstractTestExecutionListener {    
    @Override
    public void beforeTestClass(TestContext testContext) throws Exception {
        IDatabaseConnection dbConn = new DatabaseDataSourceConnection(
                testContext.getApplicationContext().getBean(DataSource.class)
                );
        dbConn.getConnection().prepareStatement("SET DATABASE REFERENTIAL INTEGRITY FALSE").execute();

    }
}

次に、テストで既に配置されているコレクションにこのリスナーを追加するだけです。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"applicationContext-test.xml"})
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class, DataSetTestExecutionListener.class, ForeignKeyDisabling.class})
于 2012-04-25T08:56:37.857 に答える
0

おそらくDBUnitを使用して、@Beforeを挿入して、いくつかのフィクスチャを作成することに時間を費やすことを検討します。

ところで、AbstractTransactionalJUnit4Test は Spring 3.0 で非推奨になりました

于 2010-04-21T20:44:28.510 に答える