source

@Test 후 롤백 트랜잭션

manysource 2023. 1. 27. 21:22

@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