2

@SpringBootTest@Transactionalを組み合わせると、テストがフリーズし、決して回復しません。@SpringBootTestと@Transactionalがテストをフリーズさせます

私は問題のデモンストレーションを作成しました。

getAgainは、@Beforeによって引き起こされるユニークな制約違反のために失敗します。これを解決するために、私は通常、各テストの後に自動的に変更をロールバックするために@Transactional above the classを含めます。しかし、これにより、テストはフリーズし、決して回復しません。

なぜこれら2つの注釈がうまく一緒に再生されないのでしょうか?

+0

デッドロックが発生しているためです。あなたは完全なアプリケーションを起動しています( '@ SpringBootTest'と同じです)してからデータを挿入します(トランザクションはまだ開いています)。次に、コントローラを呼び出してトランザクションを開こうとすると(あなたは完全なアプリケーションを起動したと言いますが)、他のトランザクションが終了していないため、テーブルから読み取ることができません。デッドロック。 –

+1

私はこれをどのように解決できるかに関する提案はありますか?私は、与えられたデータセットの組み込みデータベースを使用してアプリケーションをエンドツーエンドでテストしたいと考えています。 – Corey

答えて

0

また、私はあなたのサンプルプロジェクトに変更を加えた代わりにResourceDatabasePopulator

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 
@SqlGroup({ 
     @Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = "/testbed.sql"), 
     @Sql(executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, scripts = "/clear.sql") }) 
public class UserControllerTest { 

のデータベースを初期化するために@SqlGroupを利用することができますし、それが正常に動作します。 ここに表示されます:springboottest-transactional

関連する問題