设为首页 收藏本站
查看: 1116|回复: 0

[经验分享] 配置Spring Mybatis JUnit测试环境的应用上下文

[复制链接]

尚未签到

发表于 2016-11-27 11:26:23 | 显示全部楼层 |阅读模式
  Spring-test模块中的应用上下文和web及spring boot的有很大差异。主要试下来差异有:


  • 单元测试的app context不支持从外部properties文件注入属性
  • @Value注解不能解析带通配符的路径字符串
  解决第一个问题可以配置一个PropertyPlaceholderConfigurer的bean。
  第二个问题的具体实例是:
  @Value(value = "classpath:mybatis/sqlmap/**/*.xml")
  private Resource[] mapperLocations;
  解决此问题的一个变通办法是用PathMatchingResourcePatternResolver的getResources()方法来达到相同功能。
  以下代码是完整的例子:

package com.abc.app1.dao;
import com.alibaba.druid.filter.Filter;
import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.pool.DruidDataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.support.TransactionTemplate;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
@Configuration
@MapperScan(basePackageClasses = MapperMarker.class)
@ComponentScan(basePackageClasses = RepositoryMarker.class)
public class UTDalConfig {
@Bean
public PropertyPlaceholderConfigurer propertyPlaceHolderConfigurer() {
PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer();
Resource resource = new ClassPathResource("application.properties");
cfg.setLocations(resource);
return cfg;
}
@Bean(autowire = Autowire.BY_NAME)
public SqlSessionFactoryBean sqlSessionFactory() {
try {
SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] mapperLocations = resolver.getResources("classpath:mybatis/sqlmap/**/*.xml");
ssfb.setMapperLocations(mapperLocations);
ssfb.setTypeAliasesPackage("com.pajk.ic.api.model.domain");
return ssfb;
}
catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Bean(initMethod = "init", destroyMethod = "close")
@Autowired
public DruidDataSource dataSource(
@Value("${jdbc.url}") String url,
@Value("${jdbc.username}") String username,
@Value("${jdbc.password}") String password,
@Value("${jdbc.maxActive}") int maxActive,
@Value("${jdbc.maxWait}") int maxWait,
@Value("${jdbc.initialSize}") int initialSize,
@Value("${jdbc.minIdle}") int minIdle,
@Value("${jdbc.slowSqlMillis}") int slowSqlMillis
) throws SQLException {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setUrl(url);
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
druidDataSource.setMaxActive(maxActive);
druidDataSource.setInitialSize(initialSize);
druidDataSource.setMaxWait(maxWait);//30s
druidDataSource.setMinIdle(minIdle);
druidDataSource.setTimeBetweenEvictionRunsMillis(3000);
druidDataSource.setMinEvictableIdleTimeMillis(300000);
druidDataSource.setValidationQuery("select 1");
druidDataSource.setTestWhileIdle(true);
druidDataSource.setTestOnBorrow(false);
druidDataSource.setTestOnReturn(false);
druidDataSource.setPoolPreparedStatements(true);
druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(20);
druidDataSource.setFilters("config");
Properties properties = new Properties();
properties.put("config.decrypt", "true");
druidDataSource.setConnectProperties(properties);
StatFilter statFilter = new StatFilter();
statFilter.setSlowSqlMillis(slowSqlMillis);//5s。。慢
statFilter.setMergeSql(true);
List<Filter> filterList = new ArrayList<Filter>();
filterList.add(statFilter);
druidDataSource.setProxyFilters(filterList);
return druidDataSource;
}
@Bean(autowire = Autowire.BY_NAME)
public TransactionTemplate transactionTemplate() {
TransactionTemplate template = new TransactionTemplate();
return template;
}
@Bean(autowire = Autowire.BY_NAME)
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager();
}
}

  此例的数据源配置使用的阿里巴巴的Druid。你可以换成如DBCP,cp30等实现。不过Druid应该是比较强大和稳定的数据库连接池解决方案。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-306150-1-1.html 上篇帖子: eclipse项目log4j打印mybatis的debug日志 下篇帖子: MyBatis+Spring基于接口编程的原理分析(Mapper)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表