Search code examples
javasqljpahsqldbsavepoints

How can to set savepoint in integration tests (with hsqldb in-memory)?


I have integration tests with hsqldb (in memory), now I need to set savepoint in my tests, in BaseTest class, How can to set savepoint in tests (hsqldb (in-memory))?

BaseTest:

@ContextConfiguration(classes = {TestConfig.class})
public class BaseTest {

    @Before
    public void savePoint() {
        //set savepoint - How can do it this?

    }

    @After
    public void rollBackToSavePoint() {
        //roll back to savepoint - How can do it this?

    }
}

my Test:

@RunWith(SpringJUnit4ClassRunner.class)
public class MyTest extends BaseTest {

    @Test
    public void test1() {
     ...
    }
}

TestConfig:

import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;

@Configuration
@EnableJpaRepositories("database.dao")
@ComponentScan(basePackageClasses = { MyServiceImpl.class})
@EntityScan({"database.model"})
@Import({DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class TestConfig {

...

}

Solution

  • It helped me:

    import org.springframework.transaction.PlatformTransactionManager;
    import org.springframework.transaction.TransactionDefinition;
    import org.springframework.transaction.TransactionStatus;
    import org.springframework.transaction.support.DefaultTransactionDefinition;
    
        @Autowired
        private PlatformTransactionManager platformTransactionManager;
    
        @Test
        public void test1() {
            //save new user in db:
            userDao.save(new User("Name1")); //in result in db 1 user
            //set savepoint:
            TransactionStatus status = platformTransactionManager.getTransaction(
                    new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRED));
            //do changes in db:
            userDao.save(new User("Name2")); //in result in db 2 users
            //roll back to savepoint:
            platformTransactionManager.rollback(status);
            userDao.findAll(); //in result in db 1 user
        }