粗糙的研究了下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的更多相关文章

  1. running programmer——spring-01(初谈spring)

    今天主要是通过一个简单的登录程序学习一些spring做基础的配置和功能. I.spring的核心配置applicationContext.xml 关于bean的配置官方给出的最基础的配置文件如下: & ...

  2. 初入 Spring.net

    IOC:Inversion Of Control 控制翻转:就是创建对象的权利由开发人员自己控制,转换到了由容器来控制 我用的是winform里的一个按键来触发的 首先要引入两个Spring.net的 ...

  3. 初尝Spring Cloud Config

    1,下载源码 地址https://spring.io/guides/gs/centralized-configuration/ 2,导入工程 解压后分别把Server端与Client端导入到两个Ecl ...

  4. IDEA 初建Spring项目(Hello Spring)

    新建项目 在文件夹中建立一个项目文件 打开项目 打开IDEA,点击Open,根据所建项目路径找到该项目 依赖注入 点击项目名右键,点击new,点击file,创建pom.xml 内容为: <pro ...

  5. 初入spring boot(八 )Spring Data REST

    1. 什么是Spring Data REST Spring Data JPA是基于Spring Data 的Repository之上,可以将Repository自动输出为REST资源.目前Spring ...

  6. 初入spring boot(七 )Spring Data JPA

    Spring Data JPA通过提供基于JPA的Repository极大地减少JPA作为数据访问方案的代码量. 1.定义数据访问层 使用Spring Data JPA建立数据访问层十分简单,只需定义 ...

  7. 初入spring boot(五 )websocket

    一.广播式 广播式即服务端有消息时,会将消息发送给所有连接了当前endpoint的浏览器 1.配置websocket,需要在配置类上使用@EnableWebSocketMessageBroker开启w ...

  8. 初入spring boot(四 )web项目

    1. 模板引擎 spring boot提供了大量的模板引擎,包括FreeMark.Groovy.Thymeleaf.Velocity等,但spring boot中推荐用Thymeleaf,因为Thym ...

  9. Spring之初体验

                                     Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...

随机推荐

  1. 纯js拖拽参考

    function myDrag(obj){ obj.onmousedown=function(e){ var e=e||window.event; var diffX=e.clientX-this.o ...

  2. 【easyui】--普通js中获取easyui中分页信息(page,pageSize等)

    对于datagrid,获取其分页信息: 方法: var pageopt = $('#list_data').datagrid('getPager').data("pagination&quo ...

  3. NuGet 的使用

     install-package entityframework//Enable-Migrations -ContextTypeName College.Models.CollegeEntities  ...

  4. MongoDB 学习笔记(三)—— 修改器的使用

    通常文档只会有一部分数据要更新,所以使用修改器来操作文档极为高效. 小技巧:了解函数功能,不带括号即可.如:db.blog.update即可查看update函数的具体参数和方法体. $set修改器 & ...

  5. Linux学习-0627

    1.文件处理命令ls愿意:list权限:所有用户ls -a all 所有文件ls -l long 详细信息ls -d directory 查看目录,目录自己详细信息选项可以组合使用,  ls -ld ...

  6. Oracle DB 分区特性概述 Overview of Partitions

    概述:在Oracle数据库中,分区(partitioning)可以使非常大的表(table)或索引(index)分解为小的易管理的块(pieces),这些块被称作分区(partitions).每个分区 ...

  7. "大账户"时代

    当要下载某文件时,哪怕是免积分,也需要登陆账户才能下载.  当要浏览某论坛时,只有注册账户,才可以浏览帖子.  当要网购商品时,必须注册账户,还要有众多宝宝平台,才可以实现交易.  当要团购时,必须先 ...

  8. javascript 关于Date 时间类型 处理方法

    上一篇博客中和大家分享了关于 字符串转时间类型 这一篇顺便整理下 javascript 中 Date 类型的一些方法 var time = new Date(); var year=time.getY ...

  9. App创意项目助跑计划

    APP创意项目助跑计划 该计划旨在帮助同学们将各种脑中稀奇古怪的想法借助互联网/移动互联网 相关的技术变成真实的项目. 谱写你的故事,从此刻开始! 我们帮助你提高编程(Java.C++.Objecti ...

  10. .net 高效管理稀缺资源(数据库资源,文件资源等)

    MSDN建议按照下面的模式实现IDisposable接口: public class Foo: IDisposable { public void Dispose() { Dispose(true); ...