| package org.testng.spring.test; |
| |
| import java.util.Map; |
| import java.lang.reflect.Method; |
| import javax.sql.DataSource; |
| |
| import org.springframework.transaction.annotation.AnnotationTransactionAttributeSource; |
| import org.springframework.transaction.interceptor.TransactionAttributeSource; |
| import org.springframework.transaction.TransactionDefinition; |
| import org.springframework.test.annotation.*; |
| import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; |
| import org.springframework.context.ApplicationContext; |
| import org.testng.annotations.AfterMethod; |
| import org.testng.annotations.BeforeMethod; |
| |
| /** |
| * @author Hani Suleiman |
| * Date: Jan 26, 2007 |
| * Time: 8:17:20 AM |
| */ |
| public abstract class AbstractAnnotationAwareTransactionalTests |
| extends AbstractTransactionalDataSourceSpringContextTests { |
| |
| protected SimpleJdbcTemplate simpleJdbcTemplate; |
| |
| private TransactionAttributeSource transactionAttributeSource = new AnnotationTransactionAttributeSource(); |
| |
| protected ProfileValueSource profileValueSource = SystemProfileValueSource.getInstance(); |
| |
| |
| @Override |
| public void setDataSource(DataSource dataSource) { |
| super.setDataSource(dataSource); |
| // JdbcTemplate will be identically configured |
| this.simpleJdbcTemplate = new SimpleJdbcTemplate(this.jdbcTemplate); |
| } |
| |
| // TODO code to try to load (and cache!) ProfileValueSource |
| // from a given URL? It's easy enough to do, of course. |
| protected void findUniqueProfileValueSourceFromContext(ApplicationContext ac) { |
| Map beans = ac.getBeansOfType(ProfileValueSource.class); |
| if (beans.size() == 1) { |
| this.profileValueSource = (ProfileValueSource) beans.values().iterator().next(); |
| } |
| } |
| |
| @BeforeMethod |
| protected void checkTransaction(Method testMethod) throws Throwable { |
| TransactionDefinition explicitTransactionDefinition = |
| this.transactionAttributeSource.getTransactionAttribute(testMethod, getClass()); |
| if (explicitTransactionDefinition != null) { |
| logger.info("Custom transaction definition [" + explicitTransactionDefinition + " for test method " + testMethod.getName()); |
| setTransactionDefinition(explicitTransactionDefinition); |
| } |
| else if (testMethod.isAnnotationPresent(NotTransactional.class)) { |
| // Don't have any transaction... |
| preventTransaction(); |
| } |
| } |
| |
| @AfterMethod |
| protected void checkDirtiesContext(Method testMethod) { |
| if (testMethod.isAnnotationPresent(DirtiesContext.class)) { |
| AbstractAnnotationAwareTransactionalTests.this.setDirty(); |
| } |
| } |
| } |