아마도 뭔가 잘못하고 있지만 다음과 같은 상황에서 좋은 방법을 찾을 수 없습니다.Spring 트랜잭션을 다른 쓰레드로 전파하는 방법은 무엇입니까?
작업을 실행하기 위해 Spring Batch 아래에있는 서비스를 단위 테스트하고 싶습니다. 작업은 별도의 스레드에 미리 구성된 AsyncTaskExecutor
을 통해 실행됩니다. 내 단위 테스트에서 나는 싶습니다 : 작업이
- 이 작업을
- 대기를 시작합니다 서비스 메소드를 호출 몇 도메인 객체를 생성하고 DAO
- 그들을 통해 지속 도메인 객체를 검색하고 분명히 자신의 상태
을 확인, 무엇보다도 하나의 트랜잭션 내에서 실행되어야하지만 불행하게도, transactions are not propagated to new threads는 (나는이 뒤에 근거를 이해). 내 마음에 온
아이디어 :
- 단계 (1) 후 트랜잭션 # 1을 커밋합니다. 단위 테스트 후에 DB 상태를 롤백해야하므로 좋지 않습니다.
- 작업 구성에
Isolation.READ_UNCOMMITTED
을 사용하십시오. 그러나이를 위해서는 테스트와 생산을위한 두 가지 구성이 필요합니다.
나는 어떤 사람들이 동의하지 않는 것을 알고 있지만 실행 한 후 롤백 테스트를 실행하는 아주 좋은 방법이 아닙니다. 특히 ORM을 사용하는 경우 세션을 선택하거나 플러시 할 때까지 삽입/업데이트 명령을 실행하지 않으므로 ORM을 사용하는 경우 특히 유용합니다. – Augusto
@Augusto : 테스트가 서로 충돌하지 않기 때문에 롤백 기능이 좋습니다. 그렇지 않으면 유닛 테스트 클래스 당 하나의'setUp()'과 정확히 하나의'test()'가 필요합니다.보상 트랜잭션 (예 :'delete form mytable')을 사용할 수는 있지만 스프링 철학에 어떻게 맞는지는 알 수 없습니다. –
다시, 나는 모두가 내가 제안한 것에 동의한다고 생각하지 않는다. 그리고 실제로 무언가를 테스트하고 있는지 확인해야합니다. 그렇지 않으면 어설 션없이 테스트를 수행하는 것과 같습니다. – Augusto