1

Spring Container に簡単なテストがあります。

public class JpaCategoryRepositoryTest extends AbstractJpaJavaTestBase {

    @Inject
    private CategoryService categoryService;

    @Test
    public void testStoreCategory(){
        final Category category = new CategoryBuilder()
                .name("Test category")
                .build();
        assertEquals("Cateogory ID is not assigned", 0L, category.getId());
        categoryService.storeCategory(category);
        assertNotEquals("Category ID is persistent", 0L, category.getId());
    }
}

assertNotEquals失敗します。トランザクションはまだコミットされていないと思いました。OK、トランザクション管理を追加してテストを更新しました。

public class JpaCategoryRepositoryTest extends AbstractJpaJavaTestBase {

    @Inject
    private CategoryService categoryService;

    @Inject
    TransactionTemplate transactionTemplate;

    @Test
    public void testStoreCategory(){
        final Category category = new CategoryBuilder()
                .name("Test category")
                .build();
        assertEquals("Cateogory ID is not assigned", 0L, category.getId());
        transactionTemplate.execute(new TransactionCallback<Void>() {
            @Override
            public Void doInTransaction(TransactionStatus status) {
                categoryService.storeCategory(category);
                return null;
            }
        });
        assertNotEquals("Category ID is persistent", 0L, category.getId());
    }
}

しかし、それは役に立ちませんでした。統合テスト中にエンティティが保存されたことをテストするための最適なパターンは何ですか? テストが失敗した後にテーブルを確認すると、実際のエンティティが保存されます。

4

2 に答える 2

3

JPA仕様では、エンティティのIDが正確に設定されるかどうかはJPA実装に任されています。ただし、エンティティがデータベースに書き込まれるときに設定する必要があります。これを強制するには、entityManager.flush() を呼び出します。したがって、entityManager をテストに追加します。

@PersistenceContext
private EntityManager entityManager;

エンティティを保存した後、flush() を呼び出します。

categoryService.storeCategory(category);
entityManager.flush();

テストを修正する必要があります。

参照: JPA はいつ @GeneratedValue @Id を設定しますか?

于 2013-10-22T10:37:35.340 に答える
1

現時点では、永続化されたばかりのエンティティの ID を取得するための解決策が見つかりませんでした。id 生成戦略、jpa プロバイダーなどに依存する場合があります。

エンティティが永続化されていることをテストするために、テストの前とトランザクションのコミット後に数またはレコードをチェックしています。テストは次のようになります。

@Inject
private CategoryService categoryService;

@PersistenceContext
private EntityManager entityManager;

@Inject
TransactionTemplate transactionTemplate;

@Test
public void testStoreCategory(){
    final Category category = new CategoryBuilder()
            .name("Test category")
            .build();
    assertEquals("The number of test categories loaded during initial setup is incorrect",
            1, entityManager.createQuery("SELECT c FROM Category c").getResultList().size());
    assertEquals("Cateogory ID is not assigned", 0L, category.getId());
    transactionTemplate.execute(new TransactionCallbackWithoutResult() {
        @Override
        protected void doInTransactionWithoutResult(TransactionStatus status) {
            categoryService.storeCategory(category);
        }
    });
    assertEquals("The test category has not been persisted",
            2, entityManager.createQuery("SELECT c FROM Category c").getResultList().size());
}
于 2013-10-23T08:57:55.967 に答える