2011-12-24 7 views
1
  1. 問題は、永続エンティティが機能するかどうかをテストする方法です。 JPAエンティティのマッピングが正しいかどうか、特に@ OneToMany/@ ElementCollection/@ ManyToMany/@ OneToOne(カスケード属性(例:CascadeType.ALL))の複雑なエンティティマッピングの場合は、すべて期待どおりに動作するかどうかをテストすることは意味があると思います。そして、すべてのFK/PK/Unique制約が満たされていることを確認してください。JPAエンティティの挿入をテストするにはどうすればよいですか?

  2. これは一般的な質問です。具体的な部分はSpring Testing Frameworkについてです。あなたは、DAO層がテストで以下のコード、上で見たが、試験方法が@Transactionalとしてマークされているので、私は確認することができますどのようにので、ここでは、ロールバックする必要がある変更必見べきの代わりであることができます変更は実際にデータベースに保存されました。おそらくトランザクションにロールバックが設定されているため、すべてがメモリに保持されているため、実際にデータベースにデータが送信されませんでした。 012. account.getId()は0を返します(ID生成は@SequenceGeneratorを使用して行われます)が、この値は決してアカウントのidフィールドに割り当てられていないようです。このテストはメソッドに@Rollback(false)という注釈が付けられている場合にのみ渡されるため、ロールバックは発生しません。この場合、テスト用の@Transactionalを使用すると、すべてがメモリに格納されます(少なくともflush()が呼び出されない限り)ので、データベースの制約を確認することはできません。

  3. 上記の考え方によれば、エンティティの挿入をテストする適切な方法は何ですか、そして挿入が完了したことを確認してから、すべてを初期状態にロールバックします。 (テストが実行されるたびに@Before内のデータベースをクリーンアップしてください)

  4. 私は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 
        } 
    } 
    
+0

個別のテストデータベースは、(インメモリデータベース一切偽物が、生産のために使用されるのと同じデータベースプラットフォーム)を使用しないので、その上のすべてを削除しても安全である、実際に私はからデータベースを作成していますテストを実行する前にスクラッチ(spring jdbc:initialize-databaseを使用)してください。 – akazlou

答えて

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

関連する問題