복붙노트

[SPRING] @Test 이후 롤백 트랜잭션

SPRING

@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을 사용하고있다.

해결법

  1. ==============================

    1.테스트 상단에 @Transactional 주석을 추가하면됩니다.

    테스트 상단에 @Transactional 주석을 추가하면됩니다.

    @RunWith(SpringJUnit4ClassRunner.class)  
    @ContextConfiguration(locations = {"testContext.xml"})
    @Transactional
    public class StudentSystemTest {
    

    기본적으로 Spring은 테스트 메소드와 @ Before / @ 콜백 후에 새로운 트랜잭션을 시작하고 마지막에는 롤백합니다. 기본적으로 작동하며 컨텍스트에서 일부 트랜잭션 관리자가 있으면 충분합니다.

    보낸 사람 : 10.3.5.4 트랜잭션 관리 (대담한 광산) :

  2. ==============================

    2.옆으로 : Tomasz Nurkiewicz의 답변을 거부하려고하는 시도가 거부되었습니다.

    옆으로 : Tomasz Nurkiewicz의 답변을 거부하려고하는 시도가 거부되었습니다.

    통합 테스트에 대한 관련 문서 섹션에 대한 정확하고 영구적 인 링크

    @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());
        }
    }
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = {Persistence.class, SomeRepository.class})
    @Transactional
    public class SomeRepositoryTest { ... }
    
  3. ==============================

    3.@Transactional을 추가하는 것에 대한 답변은 정확 합니다만, 간단하게 말해서 테스트 클래스가 AbstractTransactionalJUnit4SpringContextTests를 확장하도록 할 수 있습니다.

    @Transactional을 추가하는 것에 대한 답변은 정확 합니다만, 간단하게 말해서 테스트 클래스가 AbstractTransactionalJUnit4SpringContextTests를 확장하도록 할 수 있습니다.

  4. ==============================

    4.나도 알아, 나는 대답을 게시하기 위해 늦게 tooooo이지만, 그것이 누군가를 도울 수 있기를 바래. 게다가, 나는 내 테스트에서 내가 가진이 문제를 해결했다. 이것이 내가 시험에서 얻은 것입니다.

    나도 알아, 나는 대답을 게시하기 위해 늦게 tooooo이지만, 그것이 누군가를 도울 수 있기를 바래. 게다가, 나는 내 테스트에서 내가 가진이 문제를 해결했다. 이것이 내가 시험에서 얻은 것입니다.

    내 테스트 클래스

    @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" />
    

    희망이 도움이됩니다.

  5. ==============================

    5.스프린트 컨텍스트와 트랜잭션 관리자 (예 :

    스프린트 컨텍스트와 트랜잭션 관리자 (예 :

    @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
         }
    }
    

    자세한 내용은 10 장. Spring 참조 테스트를 참조하십시오.

  6. ==============================

    6.롤백을 비활성화 할 수 있습니다.

    롤백을 비활성화 할 수 있습니다.

    @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();
        }
    }
    
  7. from https://stackoverflow.com/questions/12626502/rollback-transaction-after-test by cc-by-sa and MIT license