@Test 후 롤백 트랜잭션
우선 StackOverflow에서 이 문제에 대해 많은 스레드를 발견했지만, 어느 것도 도움이 되지 않았기 때문에 중복 질문을 드려 죄송합니다.
스프링 테스트를 사용하여 JUnit 테스트를 실행 중인데 코드는 다음과 같습니다.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {})
public class StudentSystemTest {
@Autowired
private StudentSystem studentSystem;
@Before
public void initTest() {
// set up the database, create basic structure for testing
}
@Test
public void test1() {
}
...
}
나의 문제는 내 시험이 다른 시험에 영향을 미치지 않기를 바란다는 것이다.그래서 각 테스트마다 롤백과 같은 것을 만들고 싶습니다.이것 때문에 많이 찾아봤지만, 지금까지 아무것도 못 찾았어요.Hibernate와 MySql을 사용하고 있습니다.
추가만 하면 됩니다.@Transactional
테스트 맨 위에 주석:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"testContext.xml"})
@Transactional
public class StudentSystemTest {
기본적으로 Spring은 테스트 방법과 관련된 새로운 트랜잭션을 시작합니다.@Before
/@After
콜백, 마지막에 롤백.기본적으로 작동하며 컨텍스트에 트랜잭션 관리자를 두어도 충분합니다.
송신원: 10.3.5.4 트랜잭션 관리(볼드 마이닝):
Test Context 프레임워크에서 트랜잭션은 Transactional Test Execution Listener에 의해 관리됩니다.주의:
TransactionalTestExecutionListener
디폴트로 설정되어 있습니다(명시적으로 선언하지 않은 경우라도).@TestExecutionListeners
네 시험 수업에서.단, 트랜잭션 지원을 활성화하려면PlatformTransactionManager
로딩된 응용 프로그램콘텍스트의 bean@ContextConfiguration
의미론또한 테스트에 대한 클래스 또는 메서드 수준에서 선언해야 합니다.
제쳐두고: Tomasz Nurkiewicz의 답변을 수정하려는 시도는 거부되었습니다.
이 편집에 의해, 투고는 읽기 쉽고, 찾기 쉽고, 정확하거나, 액세스하기 쉬워지지 않습니다.변경은 완전히 불필요하거나 가독성을 해칩니다.
통합 테스트에 관한 문서의 관련 섹션에 대한 정확하고 영구적인 링크
트랜잭션 지원을 활성화하려면
PlatformTransactionManager
에 있는 빈ApplicationContext
를 통해 로드됩니다.@ContextConfiguration
의미론
@Configuration
@PropertySource("application.properties")
public class Persistence {
@Autowired
Environment env;
@Bean
DataSource dataSource() {
return new DriverManagerDataSource(
env.getProperty("datasource.url"),
env.getProperty("datasource.user"),
env.getProperty("datasource.password")
);
}
@Bean
PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
}
또한, 봄을 선언해야 합니다.
@Transactional
클래스 또는 방법 수준에서 테스트에 대한 주석을 표시합니다.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {Persistence.class, SomeRepository.class})
@Transactional
public class SomeRepositoryTest { ... }
테스트 방법 주석 달기
@Transactional
는 기본적으로 테스트 완료 후 자동으로 롤백되는 트랜잭션 내에서 테스트를 실행합니다.테스트 클래스에 주석을 붙이는 경우@Transactional
클래스 계층 내의 각 테스트 메서드는 트랜잭션 내에서 실행됩니다.
추가에 대한 답변@Transactional
하기 위해서 .extends AbstractTransactionalJUnit4SpringContextTests
.
알아요, 답장을 올리기엔 너무 늦었지만 누군가에게 도움이 되길 바래요.게다가, 난 방금 내 시험 문제를 해결했어.시험 결과는 다음과 같습니다.
나의 시험 수업
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "path-to-context" })
@Transactional
public class MyIntegrationTest
컨텍스트 xml
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
데이터베이스가 자동으로 정리되지 않는 문제가 있었습니다.
BasicDataSource에 다음 속성을 추가하자 문제가 해결되었습니다.
<property name="defaultAutoCommit" value="false" />
도움이 됐으면 좋겠다.
「 」의 해, 「 」@Transactional
@Test
를 붙여야 .@Rollback(false)
스프링 콘텍스트와 트랜잭션 매니저를 사용하여 테스트를 실행해야 합니다.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/your-applicationContext.xml"})
@TransactionConfiguration(transactionManager="txMgr")
public class StudentSystemTest {
@Test
public void testTransactionalService() {
// test transactional service
}
@Test
@Transactional
public void testNonTransactionalService() {
// test non-transactional service
}
}
자세한 내용은 스프링 참조 장을 참조하십시오.
롤백을 디세블로 할 수 있습니다.
@TransactionConfiguration(defaultRollback = false)
예:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@Transactional
@TransactionConfiguration(defaultRollback = false)
public class Test {
@PersistenceContext
private EntityManager em;
@org.junit.Test
public void menge() {
PersistentObject object = new PersistentObject();
em.persist(object);
em.flush();
}
}
언급URL : https://stackoverflow.com/questions/12626502/rollback-transaction-after-test
'source' 카테고리의 다른 글
"GROUP BY"의 모든 항목 수에 대한 "카운트(*)"의 백분율 가져오기 (0) | 2023.01.27 |
---|---|
'getaddrinfo EAI_AGAIN' 오류의 원인은 무엇입니까? (0) | 2023.01.27 |
Python 2.X의 범위와 xrange 함수의 차이점은 무엇입니까? (0) | 2023.01.27 |
java: 어떤 유형에서 다른 유형으로 변수를 동적으로 캐스팅하려면 어떻게 해야 합니까? (0) | 2023.01.27 |
Axios 대행 수신자가 원래 요청을 재시도하고 원래 약속에 액세스합니다. (0) | 2023.01.27 |