[SPRING] 봄 / JTA / JPA DAO 통합 테스트가 롤백되지 않습니까?
SPRING봄 / JTA / JPA DAO 통합 테스트가 롤백되지 않습니까?
DAO 통합 테스트는 테스트 도중 작성된 엔티티가 다음 테스트가 시작될 때 데이터베이스에 남아 있기 때문에 실패합니다. MySQL 5와 H2에서 똑같은 동작이 나타납니다.
테스트 클래스는 다음과 같이 주석이 붙습니다.
@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration( { "/testPersist-applicationContext.xml" })
테스트 응용 프로그램 컨텍스트의 트랜잭션 bean 구성은 다음과 같습니다.
<tx:annotation-driven />
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="atomikosTransactionManager" />
<property name="userTransaction" ref="atomikosUserTransaction" />
</bean>
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">
<property name="forceShutdown" value="false" />
</bean>
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
<property name="transactionTimeout" value="300" />
</bean>
엔티티 관리자는 다음과 같이 구성됩니다.
<bean id="myappTestLocalEmf"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="myapp" />
<property name="persistenceUnitPostProcessors">
<bean class="com.myapp.core.persist.util.JtaPersistenceUnitPostProcessor">
<property name="jtaDataSource" ref="myappPersistTestJdbcDataSource" />
</bean>
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="false" />
<property name="database" value="$DS{hibernate.database}" />
<property name="databasePlatform" value="$DS{hibernate.dialect}" />
</bean>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup
</prop>
<prop key="hibernate.format_sql">true"</prop>
<prop key="hibernate.use_sql_comments">true</prop>
</props>
</property>
</bean>
<context:annotation-config />
로그 파일의 모든 내용은 괜찮아 보입니다 ... 나는 롤백에 관한 Spring의 메시지와 롤백에 관한 Atomikos의 메시지를 볼 수 있습니다. 하지만 솔직히 말해서, 로그는 너무 거대하고 복잡해서 쉽게 뭔가를 놓칠 수 있습니다 ...
그러나 삽입 된 테스트 데이터는 그대로 유지됩니다! 모든 단서?
해결법
-
==============================
1.내 C3P0 JDBC 데이터 소스는 XA를 인식하지 못했기 때문에 트랜잭션에 참여하지 않았습니다. 왜 내가 로그 파일에서 오류나 경고를받지 못했는지 모르겠습니다. 그럼에도 불구하고 XA 인식 데이터 소스를 사용할 수없는 이유는 여기에서 매우 잘 설명됩니다. 데이터 소스는 XA를 지원할 필요는 없습니다 ... 단지 XA를 인식 할 수 있습니다.
내 C3P0 JDBC 데이터 소스는 XA를 인식하지 못했기 때문에 트랜잭션에 참여하지 않았습니다. 왜 내가 로그 파일에서 오류나 경고를받지 못했는지 모르겠습니다. 그럼에도 불구하고 XA 인식 데이터 소스를 사용할 수없는 이유는 여기에서 매우 잘 설명됩니다. 데이터 소스는 XA를 지원할 필요는 없습니다 ... 단지 XA를 인식 할 수 있습니다.
C3P0 데이터 소스를 다음 데이터 소스로 대체하면 문제가 해결됩니다.
<bean id="myappJTANonXADataSource" class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean"> <property name="uniqueResourceName" value="myappDatabase" /> <property name="driverClassName" value="$DS{hibernate.connection.driver_class}" /> <property name="url" value="$DS{hibernate.connection.url}" /> <property name="user" value="$DS{hibernate.connection.username}" /> <property name="password" value="$DS{hibernate.connection.password}" /> <property name="maxPoolSize" value="20" /> <property name="reapTimeout" value="300" /> </bean>
-
==============================
2.나는 당신이 세부 사항에있는 통나무를 통해서 갈 필요가있을 것이라는 점을 생각한다. 처음에 커밋을 실행 한 것을 제외하면 현재보고있는 롤백이 작동 중일 수 있습니다. 또한 자동 롤백을 나타내는 코드에서 아무것도 볼 수 없습니다. 그리고 그것은 각 테스트가 끝날 때 발생해야합니다. 시간 초과 기반 롤백에 의존하는 경우 시간 초과가 발생하기 전에 두 번째 테스트가 실행 중이므로 롤백되기 전에 데이터를 확인합니다.
나는 당신이 세부 사항에있는 통나무를 통해서 갈 필요가있을 것이라는 점을 생각한다. 처음에 커밋을 실행 한 것을 제외하면 현재보고있는 롤백이 작동 중일 수 있습니다. 또한 자동 롤백을 나타내는 코드에서 아무것도 볼 수 없습니다. 그리고 그것은 각 테스트가 끝날 때 발생해야합니다. 시간 초과 기반 롤백에 의존하는 경우 시간 초과가 발생하기 전에 두 번째 테스트가 실행 중이므로 롤백되기 전에 데이터를 확인합니다.
여기에 많은 옵션이 있습니다 :-)
from https://stackoverflow.com/questions/3128111/spring-jta-jpa-dao-integration-test-doesnt-rollback by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring Bean 사용자 정의 범위 JMS (0) | 2019.05.11 |
---|---|
[SPRING] Classpath를 가진 Spring Boot 실행 가능한 Jar (0) | 2019.05.11 |
[SPRING] RequestContextHolder와 같은 Response의 홀더 클래스가없는 이유는 무엇입니까? (0) | 2019.05.11 |
[SPRING] Spring 클라우드 스트림 - 애플리케이션 초기화 후 메시지 보내기 (0) | 2019.05.11 |
[SPRING] 스프링 보안 : @PreAuthorize에서 Hibernate 엔티티 매개 변수에 액세스 할 수없는 이유는 무엇입니까? (0) | 2019.05.11 |