AbstractAnnotationAwareTransactionalTests.java :  » Testing » testng » org » testng » spring » test » Java Open Source

Java Open Source » Testing » testng 
testng » org » testng » spring » test » AbstractAnnotationAwareTransactionalTests.java
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();
    }    
  }  
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.