문제
는 내가 본 @Transactional
은 더 나은 위치에서 서비스하지만 문제는 나지 않을 시험할 수 있는 내소기 때문에 정확하게 변경되지 않은 투입된다.
테스트할 때 저장소 save()
방법을 사용하고 싶 find()
하십시오 엔터티를 올바르게 저장하기 때문에 그러 save()
변경되지 않은 투입된 데이터베이스 find()
는 null 을 반환합니다.
유일한 솔루션이 나오는 추가 @Transactional
주석:
- 에 저장소
save()
방법 - 에
testSave()
method=>지만 IMO 이것은 잘못이기 때문에 그것은 동작을 수정
어쩌면 내가 오해 뭔가를 배우기 시작 Java 니다.
해결책
당신이 필요로 하지 않는 변경을 위해 각 데이터베이스에만 필요한 쿼리를 실행에서 같은 트랜잭션이 있습니다.다음을 사용하지 않아야 같은 방법으로는 데이터를 저장하여 데이터를 검색합니다.기본적으로 사용해야 합니다 일반 jdbc 을 테스트하는 경우 추가되었습니다.
public class TestClass extends AbstractTransactionalSpringJUnit4ContextTests {
private TestRepository repo;
@Test
public void testSave() {
int rowCount = countRowsInTable("your-table-name");
repo.save(yourEntity);
repo.flush();
int rowCountAfter = countRowsInTable("your-table-name");
assertTrue(rowCountAfter - rowCount == 1); // Or whatever you like to verify the row was added
}
참고:지 않은 경우 확장 JpaRepository
이 없 flush
방법 대신에 삽입할 수 있습니다 EntityManager
에서 테스트 케이스와 통화 flush
습니다.
대신 테스트 행의 수 있도를 사용하여 jdbcTemplate
서 AbstractTransactionalJunit4SpringContextTests
를 검색하는 새로 추가되는 행와 비교 당신이 무엇을 것으로 예상됩니다.
다른 팁
그런 이유로 당신은 시작할 것을 테스트 단위 테스트를 작성하여 쓰는 동안 생산 코드입니다.하지만 당신은 배우기 시작했 Java 이틀 전에 당신은 정말을 얻으로 트랜잭션 관리 right off the bat.기초 학습과 디자인이 처음이다.