問題は、永続エンティティが機能するかどうかをテストする方法です。 JPAエンティティのマッピングが正しいかどうか、特に@ OneToMany/@ ElementCollection/@ ManyToMany/@ OneToOne(カスケード属性(例:CascadeType.ALL))の複雑なエンティティマッピングの場合は、すべて期待どおりに動作するかどうかをテストすることは意味があると思います。そして、すべてのFK/PK/Unique制約が満たされていることを確認してください。JPAエンティティの挿入をテストするにはどうすればよいですか?
これは一般的な質問です。具体的な部分はSpring Testing Frameworkについてです。あなたは、DAO層がテストで以下のコード、上で見たが、試験方法が@Transactionalとしてマークされているので、私は確認することができますどのようにので、ここでは、がロールバックする必要がある変更必見べきの代わりであることができます変更は実際にデータベースに保存されました。おそらくトランザクションにロールバックが設定されているため、すべてがメモリに保持されているため、実際にデータベースにデータが送信されませんでした。 012. account.getId()は0を返します(ID生成は@SequenceGeneratorを使用して行われます)が、この値は決してアカウントのidフィールドに割り当てられていないようです。このテストはメソッドに@Rollback(false)という注釈が付けられている場合にのみ渡されるため、ロールバックは発生しません。この場合、テスト用の@Transactionalを使用すると、すべてがメモリに格納されます(少なくともflush()が呼び出されない限り)ので、データベースの制約を確認することはできません。
上記の考え方によれば、エンティティの挿入をテストする適切な方法は何ですか、そして挿入が完了したことを確認してから、すべてを初期状態にロールバックします。 (テストが実行されるたびに@Before内のデータベースをクリーンアップしてください)
私はDBUnitを使いたくありません。春を使ってDBUnitを使用する意味がありません。
@ContextConfiguration( locations = {...}) @RunWith(SpringJUnit4ClassRunner.class) public abstract class JpaRepositoryTest { } public class JpaAccountRepositoryTest extends JpaRepositoryTest { @Inject private AccountRepository accountRepository; @Inject private Account account; @Test @Transactional public void createAccount() { accountRepository.save(account); assertEquals(1, account.getId()); // this assertion will be failed, until @Rollback(false) is used } }
1
A
答えて
2
あなたの制約が延期されていない、とあなたが保存するコール後にセッションをフラッシュする場合は、すべてがデータベースに書き込まれ、制約が適用されます。クエリを実行し、エンティティが返されるかどうかを確認することができます。しかし、返されたエンティティは、セッションによってメモリに保持されるエンティティになります。
本当に何かが正しく永続化されていることを確認したいときは、(TransactionTemplateを使用して)1つのトランザクションでpersistを実行してから、トランザクションをコミットした後にすべてを確認するクエリを実行します。
0
em.flush()とem.clear()を組み合わせて使用できます。 em.flushについては上記で説明した。 em.clear()は、コンテキストによって現在認識されているすべてのエンティティをデタッチします。
これを実行すると、最近保持されたエンティティを見つけようとすることができます。エンティティをコンテキストに追加した場合、つまりエンティティに対して実際の検索を行うようになります。私はあなたがここに投稿した質問からその事例を持っています。
How can I reliably unit test updates of a JPA entity in a unit test
関連する問題
- 1. Spring Data JPA - コンポジットキーで子エンティティを挿入するにはどうすればよいですか?
- 2. JPA CDIエンティティにDAOを挿入する
- 3. JPA:挿入後に更新されたエンティティオブジェクトを取得するにはどうすればよいですか?
- 4. 一括挿入のようなテーブルに値を挿入するにはどうすればよいですか?
- 5. テストのためにリクエストヘッダーに何かを挿入するにはどうすればよいですか?
- 6. JPAで新しいノードをリストに挿入するにはどうすればいいですか?
- 7. JPAでエンティティをどのようにマップするのですか?
- 8. フィルタの単体テストに模擬サービスを挿入するにはどうすればよいですか?
- 9. simplexml_load_fileのエラーチェックを挿入するにはどうすればよいですか?
- 10. IE8にスタイルを挿入するにはどうすればよいですか?
- 11. アクティビティをフラグメントに挿入するにはどうすればよいですか?
- 12. コールバックをインテントに挿入するにはどうすればよいですか?
- 13. PDFをXcodeに挿入するにはどうすればよいですか?
- 14. JPanelをJLabelに挿入するにはどうすればよいですか?
- 15. ノードをGPathResultに挿入するにはどうすればよいですか?
- 16. ドロップダウンリストにエラーメッセージを挿入するにはどうすればよいですか?
- 17. ラベルテキストにハイパーリンクを挿入するにはどうすればよいですか?
- 18. インメモリユーザプロバイダをサービスに挿入するにはどうすればよいですか?
- 19. ViewContainerRefをサービスに挿入するにはどうすればよいですか?
- 20. フィールドに@PathVariableを挿入するにはどうすればよいですか?
- 21. ボタンをフローティングボタンに挿入するにはどうすればよいですか?
- 22. System.windows.forms.datagridviewをダイアログに挿入するにはどうすればよいですか?
- 23. SpanElementをTextFlowに挿入するにはどうすればよいですか?
- 24. URLをフラッシュメッセージに挿入するにはどうすればよいですか?
- 25. Javaコードからjpaエンティティのddlを作成するにはどうすればよいですか?
- 26. テスト用にデモユーザーを挿入するにはどうすればよいですか?
- 27. SeleniumテストにJS関数を挿入するにはどうすればよいですか?
- 28. 挿入コードに必要な数のIDを挿入するにはどうすればよいですか?
- 29. Java JPA/Hibernate:セッション内のエンティティの複数インスタンスを回避するにはどうすればよいですか?
- 30. バックスラッシュを挿入するにはどうすればよいですか?
個別のテストデータベースは、(インメモリデータベース一切偽物が、生産のために使用されるのと同じデータベースプラットフォーム)を使用しないので、その上のすべてを削除しても安全である、実際に私はからデータベースを作成していますテストを実行する前にスクラッチ(spring jdbc:initialize-databaseを使用)してください。 – akazlou