
nl.pvanassen.guicejunitrunner.GuiceMyBatisRollbackJUnitRunner Maven / Gradle / Ivy
The newest version!
package nl.pvanassen.guicejunitrunner;
import javax.inject.Inject;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.ibatis.session.SqlSessionManager;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.*;
import org.mybatis.guice.transactional.Transactional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.AbstractModule;
import com.google.inject.Injector;
import com.google.inject.matcher.Matchers;
/**
*
* Runs test methods within a MyBatis-controlled SQL transaction and rolls back on test completion (failed or success).
*
* Example:
*
*
* @RunWith(MyBatisTestRollbackRunner.class)
* public class UserDaoTest implements MyBatisModuleProvider {
* @Inject
* private UserDao userDao;
*
* @Override
* public MyBatisModule getMyBatisModule() {
* return new PooledJdbcMyBatisModule() {
* @Override
* public void initializeForTest() {
* addMapperClass(UserMapper.class);
* addMapperClass(AddressMapper.class);
* }
* };
* }
*
* @Test
* ...
* }
*
* @ImplementedBy(UserDaoMyBatis.class)
* public interface UserDao {
* ...
* }
*
* public class UserDaoMyBatis implements UserDao {
* @Inject
* private UserMapper userMapper;
*
* @Inject
* private AddressMapper addressMapper;
*
* ...
* }
*
*/
public class GuiceMyBatisRollbackJUnitRunner extends BlockJUnit4ClassRunner {
private final Logger logger = LoggerFactory.getLogger(GuiceMyBatisRollbackJUnitRunner.class);
private final Injector injector;
@Inject
private SqlSessionManager sqlSessionManager;
/**
* Instances a new JUnit runner.
*
* @param klass The test class
* @throws InitializationError In case of an error while initializing the class
*/
public GuiceMyBatisRollbackJUnitRunner(final Class> klass) throws InitializationError {
super(klass);
Class>[] classes = GuiceHelper.getModulesFor(klass);
injector = GuiceHelper.createInjectorFor(classes, new AbstractModule() {
@Override
protected void configure() {
bindInterceptor(Matchers.any(), Matchers.annotatedWith(Transactional.class), new MethodInterceptor() {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
if (sqlSessionManager != null && sqlSessionManager.isManagedSessionStarted()) {
sqlSessionManager.clearCache();
}
return invocation.proceed();
}
});
}
});
}
/**
* {@inheritDoc}
*
* @see org.junit.runners.BlockJUnit4ClassRunner#methodInvoker(org.junit.runners.model.FrameworkMethod, java.lang.Object)
*/
@Override
protected Statement methodInvoker(final FrameworkMethod method, final Object test) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
try {
sqlSessionManager.startManagedSession();
logger.debug("running method: " + method.getMethod().getName());
method.invokeExplosively(test);
} finally {
try {
sqlSessionManager.rollback(true);
} finally {
sqlSessionManager.close();
}
}
}
};
}
/**
* {@inheritDoc}
*
* Fills the test and injects the required interceptors
*
* @see org.junit.runners.BlockJUnit4ClassRunner#createTest()
*/
@Override
public Object createTest() throws Exception {
Object obj = super.createTest();
injector.injectMembers(obj);
injector.injectMembers(this);
return obj;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy