初用Spring Test
粗糙的研究了下Spring test,分享以下blog:
1. http://blog.csdn.net/shan9liang/article/details/40452469
2. http://www.ibm.com/developerworks/cn/java/j-lo-springunitest/
3. http://blog.csdn.net/feihong247/article/details/7828143
其实主要看了第一个blog,然后就下手写test了,推荐着重看看第二个blog,更详细。
之前也尝试过在Spring的项目中直接使用Junit进行单元测试,但如果涉及到配置文件的加载/数据库的操作,会带来很多麻烦。具体问题和原因可参考第一个blog。
自己动手写的TestCase如下: (留个备份,便于查阅)

被测试项目的大致结构如上。 各个类如下:
LogDAO:
public interface LogDAO {
public void save(Log log);
}
UserDAO:
public interface UserDAO {
public void save(User user);
public int findAll();
}
LogDAOImpl:
@Component(value = "logDAO")
public class LogDAOImpl implements LogDAO { private SessionFactory sessionFactory; @Autowired(required = true)
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
} @Override
public void save(Log log) {
Session session = sessionFactory.getCurrentSession();
session.save(log);
}
}
UserDAOImpl:
public class UserDAOImpl implements UserDAO {
private SessionFactory sessionFactory;
@Resource
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Override
public void save(User user) {
/*Connection connection = null;
try {
connection = dataSource.getConnection();
Statement statement = connection.createStatement();
String insertStr = "insert into user values(null,\"hehe\")";
statement.executeUpdate(insertStr);
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (connection != null){
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}*/
/*Session session = sessionFactory.openSession();
session.beginTransaction();
session.save(user);
session.getTransaction().commit();*/
Session session = sessionFactory.getCurrentSession();
session.save(user);
}
@Override
public int findAll() {
Session session = sessionFactory.getCurrentSession();
String query_sql = "select id,name from user";
Query query = session.createSQLQuery(query_sql).addEntity(User.class);
return query.list().size();
}
}
Log:
@Entity
@Table(name = "t_log")
public class Log {
private int id;
private String msg; @Id
@GeneratedValue
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getMsg() {
return msg;
} public void setMsg(String msg) {
this.msg = msg;
}
}
User:
@Entity
public class User {
private String name;
private int id; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Id
@GeneratedValue
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
}
}
UserService:
public class UserService {
private UserDAO userDAO;
private LogDAO logDAO;
@Resource
public void setLogDAO(LogDAO logDAO) {
this.logDAO = logDAO;
}
@Autowired
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
@Transactional
public void add(User user){
userDAO.save(user);
Log log = new Log();
log.setMsg("a user has been added!");
logDAO.save(log);
}
public int findAllUsers(){
return userDAO.findAll();
}
}
jdbc.properties:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring
jdbc.username=root
jdbc.password=
#######################
hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<context:annotation-config />
<context:component-scan base-package="foo.bar"/>
<bean id="userDAO" class="foo.bar.dao.Impl.UserDAOImpl"/>
<bean id="userService" class="foo.bar.service.UserService">
<property name="userDAO" ref="userDAO"/>
<property name="logDAO" ref="logDAO"/>
</bean>
<bean id="logIntercept" class="foo.bar.proxy.LogInterceptor"/> <aop:config>
<aop:pointcut id="log"
expression="execution(public void foo.bar.dao.Impl.UserDAOImpl.save(foo.bar.entity.User))"/>
<aop:aspect id="logAspect" ref="logIntercept">
<aop:before method="before" pointcut-ref="log"/>
</aop:aspect>
</aop:config> <context:property-placeholder location="jdbc.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="annotatedClasses">
<list>
<value>foo.bar.entity.User</value>
<value>foo.bar.entity.Log</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
</bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/> </beans>
Main:
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
UserService service = context.getBean(UserService.class);
User user = new User();
user.setId(10);
user.setName("Chris");
service.add(user);
}
}
其实说白了,就是将Main转换成测试类。
BaseClass:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-config.xml")
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class BaseClass { }
如果测试类继承BaseClass,则测试类无需再配置@RunWith,@ContextConfiguration以及@TransactionConfiguration。
其中的@TransactionConfiguration很重要,它控制测试过程中产生的事务是否回滚。
UserServiceTest:
public class UserServiceTest extends BaseClass{
@Resource
private UserService userService;
@Test
@Transactional //若使用事务,则使用该注解
//@Rollback(false) //可用来覆盖全局的TransactionConfiguration
public void testAdd() throws Exception {
User user = new User();
user.setName("hehe");
user.setId(100);
userService.add(user);
Assert.assertEquals(8, userService.findAllUsers());
}
}
初用Spring Test的更多相关文章
- running programmer——spring-01(初谈spring)
今天主要是通过一个简单的登录程序学习一些spring做基础的配置和功能. I.spring的核心配置applicationContext.xml 关于bean的配置官方给出的最基础的配置文件如下: & ...
- 初入 Spring.net
IOC:Inversion Of Control 控制翻转:就是创建对象的权利由开发人员自己控制,转换到了由容器来控制 我用的是winform里的一个按键来触发的 首先要引入两个Spring.net的 ...
- 初尝Spring Cloud Config
1,下载源码 地址https://spring.io/guides/gs/centralized-configuration/ 2,导入工程 解压后分别把Server端与Client端导入到两个Ecl ...
- IDEA 初建Spring项目(Hello Spring)
新建项目 在文件夹中建立一个项目文件 打开项目 打开IDEA,点击Open,根据所建项目路径找到该项目 依赖注入 点击项目名右键,点击new,点击file,创建pom.xml 内容为: <pro ...
- 初入spring boot(八 )Spring Data REST
1. 什么是Spring Data REST Spring Data JPA是基于Spring Data 的Repository之上,可以将Repository自动输出为REST资源.目前Spring ...
- 初入spring boot(七 )Spring Data JPA
Spring Data JPA通过提供基于JPA的Repository极大地减少JPA作为数据访问方案的代码量. 1.定义数据访问层 使用Spring Data JPA建立数据访问层十分简单,只需定义 ...
- 初入spring boot(五 )websocket
一.广播式 广播式即服务端有消息时,会将消息发送给所有连接了当前endpoint的浏览器 1.配置websocket,需要在配置类上使用@EnableWebSocketMessageBroker开启w ...
- 初入spring boot(四 )web项目
1. 模板引擎 spring boot提供了大量的模板引擎,包括FreeMark.Groovy.Thymeleaf.Velocity等,但spring boot中推荐用Thymeleaf,因为Thym ...
- Spring之初体验
Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...
随机推荐
- 在xml中调用自己用java代码定义的View
1.在res中new一个class继承view.View,重写ondraw方法,写出自己的view package com.zzw.myView; import android.content.Con ...
- 用FileInputStream读文件,字节数组接收,不知道文件的大小时怎么办
FileInputStream in = new FileInputStream(文件路径File); byte[] buffer = new byte[in.available()]; in.rea ...
- GetType() 和typeof() 的区别
GetType() 非强类型,支持跨程序集发射,用来支持动态引用, A obja=new A(); Type t=obja.GetType() typeof() 强类型,静态的 Type t=type ...
- python批量导出导入MySQL用户的方法
这篇文章主要介绍了 数据库迁移(A -> B),需要把用户也迁移过去,而用户表(mysql.user)有上百个用户.有2种方法进行快速迁移: 1,在同版本的条件下,直接备份A服务器的mysql数 ...
- Python学习教程(learning Python)--2.3.3 Python函数型参详解
本节讨论Python下函数型参的预设值问题. Python在设计函数时,可以给型参预设缺省值,当用户调用函数时可以不输入实参.如果用户不想使用缺省预设值则需要给型参一一赋值,可以给某些型参赋值或不按型 ...
- Web Design:给实验室UI们的一堂课(下)
[讲稿]From top to down,自顶向下哈,首部栏.导航栏之后一般是页面的主模块,也就是Body部分,这一块儿才是你网站的核心内容,文章.新闻.动态.数据.图表.相册等都是在这儿体现出来.在 ...
- DrawTool多重笔之前奏 => 通过InkAnalyzer实现图形识别
这里要介绍的是通过InkAnalyzer来实现简单图形的识别,例如圆,椭圆,正方形,三角形等,当然你也可以通过扩展来实现自定义图形的识别,在使用InkAnalyzer前,你需要引用IAWinFX.dl ...
- Redis客户端之Spring整合Jedis
1.下载相关jar包,并引入工程: jedis-2.4.2.jar commons-pool2-2.0.jar 2.将以下XML配置引入spring <bean id="shard ...
- 关于Haproxy安装和配置:负载配置【haproxy.cfg】问题记录
1. 存放地址: more /etc/haproxy/haproxy.cfg ps -ef | grep haproxy 看看有没有haproxy的进程就是了 或者看看服务器的23306的端口有没有 ...
- UITextField使用的相关方法
1.设置占位符 textField.placeholder = @“”; 2.设置暗文输入 textField.secureTextEntry = YES; 3.设置键盘类型 textField. ...