2017-05-11 39 views
9

私は、インメモリデータベース上で実行される統合テストを行っています。私は、SQLスクリプトが初期化後に実行されることを期待@Sqlを使用した@SpringBootTest:スクリプトの実行とコンテキストの初期化の順序

spring: 
    jpa: 
    hibernate: 
     ddl-auto: create-drop 

:DBスキーマがHibernateが再現されたテスト・コンテキストの初期化中

@RunWith(SpringRunner.class) 
@SpringBootTest 
@Sql("/clean-data-in-all-tables.sql") 
public class SomeTest { 
    @Test 
    public void shouldDoSomehting() {} 
} 

:各試験の署名は、多かれ少なかれ、このようになりますコンテキスト以降とdbスキーマ生成後。ただし、場合によってはclean-data-in-all-tables.sqlがスキーマの生成より前に実行され、まだ作成されていないテーブルが必要であるため、失敗します。

私は説明した方法で500を超えるテストを書いていますが、それ以上の類似のテストを追加するまで、すべてうまくいきました。

GradleまたはIntelliJで一緒に実行するとテストが失敗します。 失敗したテストは、最近追加されたテストではありません。これは私が追加したものとは全く関係のない古いテストです。また、奇妙なことに、からIntelliJまで1つずつ実行すると、のテストがうまくいきません。

これはspring-bootのバグのようですが、まだ解決策を見つけることを試みています。同時に私は問題を解決するために多くのことを試したが、どれも役に立たなかった。

あなたのアイデアは、何が助けになるか、私のコードで間違っている可能性があることをお伝えください。

UPDATE: 回避策が見つかりました:createcreate-dropからspring.jpa.hibernate.ddl-autoを変更するには、問題を解決します。

しかし、質問はまだ開いていますこのような奇妙な動作の理由は何ですか?

+0

新しい設定を追加しましたか? SpringBootTestは、テストパッケージからプロジェクトルートまでの構成を探しています。 –

+0

いいえ、私は新しい設定を導入しませんでしたが、私は既存の設定を変更しませんでした。 –

答えて

2

一つの可能​​な解決策は、(私はあなたがDBUnitのを使用するために開いているかはわからない)ことができます。

1)抽象リポジトリ統合テストを作成します。

@TestExecutionListeners({DbUnitTestExecutionListener.class}) 
@SpringApplicationConfiguration(classes = Application.class) 
@DirtiesContext 
public abstract class AbstractRepositoryIT extends AbstractTransactionalJUnit4SpringContextTests { 
} 

2)「本物」を作成します統合テスト:あなたのテストなどのための初期状態を設定することができdataset.xmlファイルで

@DatabaseSetup(SomeEntityRepositoryIT.DATASET) 
@DatabaseTearDown(type = DatabaseOperation.DELETE_ALL, value = {"dataset.xml}) 
public class SomeEntityRepositoryIT extends AbstractRepositoryIT { 
... 
} 

... More can be found here

+0

ありがとうございます。残念ながら私はDbUnitを使用することはできません。既存のテスト構成で何が間違っているかが重要です。 –

+0

はい、私はそれを理解しています。しかし、もう1つの質問 - SQLファイルは "clean-data-in-all-tables.sql"と呼ばれ、テスト中にデータベースに挿入されたすべてのデータを削除(ロールバック)するためにのみ使用されますか?たぶんあなたはそれを必要としないいくつかのソリューションで終わることができますか?あなたのテストクラスで@Transactionalを使用するような何か? – nick79

+0

DBのクリーニングに '@DirtiesContext'を使用していましたが、テスト実行に費やされる時間が2〜3倍になりました。 –

関連する問題