을 테스트하는 방법 :나는 봄 컨테이너에서 간단한 테스트를 가지고 EntityManager.persist() 호출
는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
이 실패합니다. 그 거래가 아직 커밋되지 않았다고 생각했습니다. 그래, 나는 transactio 관리를 추가 테스트를 업데이 트했습니다 :
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());
}
}
하지만 도움이되지 않았습니다. 통합 테스트 중에 엔티티가 저장되었는지 테스트하는 가장 좋은 패턴은 무엇입니까? 테스트가 실패한 후 테이블을 확인할 때 실제 엔티티가 저장됩니다.
플러싱은 SQL 쿼리가 데이터베이스로 실행됨을 의미합니다. undestand correclty 인 경우, TransactionTemplate을 명시 적으로 사용할 때도 동일하게 보관됩니다. 그래서 아무런 차이가 보이지 않습니다. 어쨌든 당신의 솔루션을 시도했지만 예외가 있습니다 : "org.springframework.transaction.InvalidIsolationLevelException : 표준 JPA는 사용자 정의 격리 수준을 지원하지 않습니다 - JPA 구현을 위해 특별한 JpaDialect를 사용하십시오" – Alexandr
유일한 방법은 엔티티의 ID는 데이터베이스에서 ID를 가져 오는 것입니다. 따라서 ID가 설정되었는지 확인하려면 데이터베이스에 대한 쿼리를 실행해야합니다 (메모리 내 데이터베이스 일 수도 있음). 예외는 구성의 격리 수준, 특히 단위 테스트에서 변경할 때 알려진 문제점입니다. https://jira.springsource.org/browse/SPR-5012 – Remco
당신이 말하는 것에 대해 이해하지 못하는 것 같습니다. 먼저 플러시하는 것이 좋습니다. 그런 다음 ID를 얻는 유일한 방법은 쿼리를 실행하는 것입니다. 다음으로는 예외 솔루션에 대한 링크를 제공하지만 트랜잭션 당 특정 격리 수준을 설정하지 않습니다. – Alexandr