내 JUnit 테스트에 @Transactional을 사용하고 있습니다 (주된 이점은 한 테스트 내에서 변경 사항을 롤백하는 것입니다.)하지만이 문제는 내 서비스 트랜잭션에 영향을 미칩니다. 그래서 예를 들면이다서비스 트랜잭션에서의 스프링 테스트
내 서비스 :
@Service
@Transactional(propagation = Propagation.REQUIRED)
public class ServiceImpl
내 단위 테스트 : 나는 두 개의 별도의 service.add (대한 거래)하지만 사용하지 않는 한이 예상 그래서 순진
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/test-context.xml" })
@Transactional
public class TestService
@Test
public void testNumberTransaction() {
Entity a = new Entity();
Entity b = new Entity();
service.add(a);
service.add(b);
}
@ nontransactional 테스트 메소드에서 하나의 트랜잭션 내에서 실행됩니다 (하지만 테스트 후 롤백하지 않음).
예상 되나요? 일부 구성으로 변경할 수 있습니까?
감사합니다.
테스트 메소드에서 @Transactional을 제거해도 트랜잭션이 롤백되지 않으므로 테스트 트랜잭션이 없습니다. 트랜잭션은 서비스 메소드가 호출 될 때 시작될 것이고, 서비스 메소드가 리턴 할 때 커밋 할 것이다. –
내 진실하고 어색한 배합. @Transactional 어노테이션을 제거하면 트랜잭션 관리자가 Java 계층에서 트랜잭션을 생성하지 못하게됩니다. 그러나 대부분의 데이터베이스는 각 세션에 대해 항상 암시 적 트랜잭션을 생성하며 자동 커밋을 해제 (기본값 : IIRC)하면 트랜잭션은 항상 롤백되는 트랜잭션과 동일한 방식으로 작동하지 않습니다. 내가 틀렸다면 나를 바로 잡아주세요. – pap
Err, no. * test * 메소드에서 Transactional을 제거하면 테스트는 트랜잭션 컨텍스트 외부에서 실행되지만 * service * 메소드는 Transactional로 주석 처리되므로 Spring은 각 서비스 메소드 호출에 대한 트랜잭션을 계속 시작합니다. 서비스 자체가 런타임 예외를 throw하지 않는 한 서비스에서 수행 된 실제 트랜잭션 작업 (일부 데이터베이스를 업데이트 할 수 있음)은 트랜잭션에서 완료되고 커밋됩니다. –