前提・実現したいこと
元々のユニットテストはDBの内容がテスト用のものへ書き換わってしまうことから、
今回DBの値を変更しないようにDataSourceをTransactionAwareDataSourceProxyでラップして書き換えない様にしようとしました。
@RunWith(SpringJUnit4ClassRunner.class) @TestExecutionListeners({DependencyInjectionTestExecutionListener.class, TransactionDbUnitTestExecutionListener.class}) @Transactional @Rollback @SpringBootTest(classes = {TestConfig.class}) public class TestClass extends DataSourceBasedDBTestCase { @Autowired DataSource datasource; protected DataSource getDataSource() { //brefore //return datasource; //after return new TransactionAwareDataSourceProxy(datasource); } }
問題その1
そうすると今まで jpaRepositoryをimplementsしたクラスのsave()やdelete()の後に flush()を書かなくてもDB処理されていたものがされなくなりました。
repository.deleteAll(); // repository.flush(); これは元々書いていなかったが、書かないと後のsave()でエラーになるようになってしまった。 ~~snip~~ // deleteAll()が処理されておらず一意制約違反等が発生する repository.save(object);
問題その2
また、わざとDataIntegrityViolationExceptionを発生させてその後にデータ取得をしようとした場合、
リポジトリにアクセスするだけで再度DataIntegrityViolationExceptionが呼びされるようになってしまいます。
try { repository.save(object); } catch (Exception e) { // 一意制約違反でエラーになることを確認 } // アクセスすると上記と同様のエラーが再度発生する repository.findById(id);
TransactionAwareDataSourceProxyを利用しつつ、これらの問題を解決する方法はありますでしょうか?
よろしくお願いします。
- flush()を書かなくてもDB操作が実行されること。
- SQL操作で例外発生後は普通にDB操作を行えること。
あなたの回答
tips
プレビュー