实现Guice下的单元测试中mybatis数据库操作的回滚.
来源:互联网 发布:php 类的魔术方法 编辑:程序博客网 时间:2024/06/11 07:01
在Spring中,提供了@transaction注解来在单元测试中,回滚数据库的操作,这样保证了单元测试的方法,不会对真实的数据库进行更新.从而更好地保持了各个单元测试方法的独立性.
在Guice中,并没有提供相应的机制. 我们可以通过自定义的BlockJUnit4ClassRunner继承子类来实现类似的功能.
代码如下:
import com.google.inject.Guice;import com.google.inject.Inject;import com.google.inject.Injector;import org.apache.ibatis.session.SqlSessionManager;import org.junit.runners.BlockJUnit4ClassRunner;import org.junit.runners.model.FrameworkMethod;import org.junit.runners.model.InitializationError;import org.junit.runners.model.Statement;public class MyBatisTestRollbackRunner extends BlockJUnit4ClassRunner { private Injector injector; @Inject private SqlSessionManager sqlSessionManager; public MyBatisTestRollbackRunner(final Class<?> clazz) throws InitializationError { super(clazz); MyBatisModuleFactory myBatisModuleFactory = new MyBatisModuleFactory(new ConfigurationFactory()); injector = Guice.createInjector(myBatisModuleFactory.get(clazz)); injector.injectMembers(this); } @Override protected Statement methodInvoker(final FrameworkMethod method, final Object instance) { return new Statement() { @Override public void evaluate() throws Throwable { try { invokeMethodInNewSession(method, instance); } finally { cleanupSession(); } } }; } private void invokeMethodInNewSession(final FrameworkMethod method, final Object instance) throws Throwable { sqlSessionManager.startManagedSession(); method.invokeExplosively(instance); } private void cleanupSession() { try { sqlSessionManager.rollback(true); } finally { sqlSessionManager.close(); } } @Override protected Object createTest() throws Exception { Object testClass = super.createTest(); injector.injectMembers(testClass); return testClass; }}import com.google.inject.name.Names;import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;import org.junit.runners.model.InitializationError;import org.mybatis.guice.MyBatisModule;import org.mybatis.guice.datasource.builtin.PooledDataSourceProvider;import java.util.Arrays;public class MyBatisModuleFactory { private final ConfigurationFactory configurationFactory; public MyBatisModuleFactory(final ConfigurationFactory configurationFactory) { this.configurationFactory = configurationFactory; } public MyBatisModule get(final Class<?> clazz) { return new MyBatisModule() { @Override protected void initialize() { bindDataSourceProviderType(PooledDataSourceProvider.class); bindTransactionFactoryType(JdbcTransactionFactory.class); addMapperClasses(); } private void addMapperClasses() { try { addMapperClasses(Arrays.asList(getAnnotatedMapperClasses(clazz))); } catch (Throwable e) { throw new UnsupportedOperationException("can't add mapper classes"); } } }; } private Class<?>[] getAnnotatedMapperClasses(final Class<?> clazz) throws InitializationError { MapperClasses annotation = clazz.getAnnotation(MapperClasses.class); if (annotation == null) { throw new InitializationError(String.format("class '%s' must have a MapperClasses annotation", clazz.getName())); } return annotation.value(); }}
总体的实现思路.
- 在创建测试方法时,使用自定义的injector.这个通过重载createTest()实现.
- 在自定义的SqlSessionManager上执行测试方法.
- 开启Session.
- 执行测试方法.
- 回滚Session.
另外,通过annotation的方式,将我们需要测试的Mapper类注册到injector中.这个在getAnnotatedMapperClasses方法中实现.
例如,我们需要测试一个ConnectorMapper的Mapper类.那么使用以下的代码进行测试.
@RunWith(MyBatisTestRollbackRunner.class)@MapperClasses({ConnectorMapper.class})public class ConnectorMapperTest { @Inject ConnectorMapper connectorMapper; //对ConnectorMapper的增删改查操作的测试方法 .....}
0 0
- 实现Guice下的单元测试中mybatis数据库操作的回滚.
- Java 中对数据库操作时的 回滚
- oralce数据库的回滚操作原理
- [搬家前]数据库操作的回滚
- SAP EJB 的数据库回滚操作
- javaEE数据库操作的回滚问题
- 数据库回滚机制(RollBack)的实现
- 数据库移植中怎样让自定义的移植操作支持回滚
- DB2分区数据库的前滚操作
- 如何通过程序实现同一事务中多次数据库更新的错误回滚?
- MyBatis 的数据库操作
- SpringMVC Mybatis的事务回滚问题
- JAVA中Oracle数据库的回滚事务模板
- 基于guice、resteasy、mybatis和undertow实现的轻量级restful服务
- 在SQL SERVER中实现事务的部分回滚
- 一个通用的单元测试框架的思考和设计05-实现篇-Guice框架启动与自动注入
- Spring-test做数据库操作的单元测试
- 使用DbUnit进行数据库操作的单元测试
- 平衡二叉树调整
- Contains Duplicate
- Paxos理解之我见
- 【Struts2框架】第三节OGNL表达式-projection投影
- c#利用regex获取字符串中汉字的个数
- 实现Guice下的单元测试中mybatis数据库操作的回滚.
- GIT 使用文档
- Entity framework框架使用Oracle数据库
- topcoder lottery game
- Paxos理解之我见(二)
- 常用的Git命令
- hdu 1018题 Big Number
- 创建多个Git帐号
- Linux的CFS(完全公平调度)算法