blob: ed4d407c34fbdd3bd8b748cfee88091574d3e6cc [file] [log] [blame]
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();
}
}
}