@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
콜백을 둘러싼 새 트랜잭션을 시작 하고 끝에서 롤백합니다. 기본적으로 작동하며 컨텍스트에 트랜잭션 관리자가 있으면 충분합니다.
From : 10.3.5.4 트랜잭션 관리 (굵은 광산) :
TestContext 프레임 워크에서 트랜잭션은 TransactionalTestExecutionListener에 의해 관리됩니다. 참고
TransactionalTestExecutionListener
된다 기본적으로 구성 명시 적으로 선언하지 않는 경우에도,@TestExecutionListeners
테스트 클래스. 그러나 트랜잭션에 대한 지원을 사용하려면 시맨틱에PlatformTransactionManager
의해로드 된 애플리케이션 컨텍스트에 Bean을 제공해야합니다@ContextConfiguration
. 또한 테스트를 위해 클래스 또는 메서드 수준에서 선언해야합니다@Transactional
.
곁에 : Tomasz Nurkiewicz의 대답을 수정하려는 시도는 거부되었습니다.
이 편집은 게시물을 좀 더 읽기 쉽고, 찾기 쉽고, 더 정확하거나, 더 쉽게 접근 할 수 있도록하지 않습니다. 변경 사항은 완전히 불필요하거나 가독성에 적극적으로 영향을 미칩니다.
통합 테스트에 대한 문서의 관련 섹션에 대한 정확하고 영구적 인 링크 .
트랜잭션 지원을 사용하려면 시맨틱을 통해로드되는
PlatformTransactionManager
에서 Bean을 구성해야합니다 .ApplicationContext
@ContextConfiguration
@ 구성 @PropertySource ( "application.properties") public class Persistence { @Autowired 환경 env; @콩 DataSource dataSource () { 새로운 DriverManagerDataSource ( env.getProperty ( "datasource.url"), env.getProperty ( "datasource.user"), env.getProperty ( "datasource.password") ); } @콩 PlatformTransactionManager transactionManager () { return new DataSourceTransactionManager (dataSource ()); } }
또한
@Transactional
테스트를 위해 클래스 또는 메서드 수준에서 Spring의 주석을 선언해야합니다 .
@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (classes = {Persistence.class, SomeRepository.class}) @ 거래 공용 클래스 SomeRepositoryTest {...}
테스트 메서드에 주석을 추가
@Transactional
하면 기본적으로 테스트 완료 후 자동으로 롤백되는 트랜잭션 내에서 테스트가 실행됩니다. 테스트 클래스에로 주석이 달린 경우@Transactional
해당 클래스 계층 구조 내의 각 테스트 메서드는 트랜잭션 내에서 실행됩니다.
The answers mentioning adding @Transactional
are correct, but for simplicity you could just have your test class extends AbstractTransactionalJUnit4SpringContextTests
.
I know, I am tooooo late to post an answer, but hoping that it might help someone. Plus, I just solved this issue I had with my tests. This is what I had in my test:
My test class
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "path-to-context" })
@Transactional
public class MyIntegrationTest
Context 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>
I still had the problem that, the database was not being cleaned up automatically.
Issue was resolved when I added following property to BasicDataSource
<property name="defaultAutoCommit" value="false" />
Hope it helps.
You need to run your test with a sprint context and a transaction manager, e.g.,
@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
}
}
See chapter 10. Testing
of the Spring reference for further details.
You can disable the Rollback:
@TransactionConfiguration(defaultRollback = false)
Example:
@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
'IT Share you' 카테고리의 다른 글
교리 2 : 쿼리 작성기로 쿼리 업데이트 (0) | 2020.11.10 |
---|---|
두 날짜 사이의 날짜 차이를 찾는 방법은 무엇입니까? (0) | 2020.11.10 |
미래가있는 Scala의 비동기 IO (0) | 2020.11.10 |
CocoaPods의 의견? (0) | 2020.11.10 |
.NET에서 정수 목록 채우기 (0) | 2020.11.10 |