粗糙的研究了下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. SQL中补0

     SQL中补0 编写人:CC阿爸 2014-3-14 第一种方法: right('00000'+cast(@count as varchar),5) 其中'00000'的个数为right函数的最后参数 ...

  2. Python基础 第一天

    编码 #coding=utf-8 函数入口 if __name__== "__main__": 内置方法 type:a=1 type(a) help:import time hel ...

  3. 开机一会,出现长时间闪屏,并且跳出SendRpt error

    通过谷歌,发现任务管理器中的Report sending utility 是属于TortoiseSVN 的,所以卸载svn ,然后重启就ok了

  4. jQuery学习笔记(6)--复选框控制表格行高亮

    <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...

  5. xtrabackup之Innobackupex全备恢复

    一.当前环境 [mysql@hadoop1 ~]$ mysql --defaults-/my.cnf -uroot -p123456 -P3306 mysql> show variables l ...

  6. STM32F0xx_RTC实时时钟配置详细过程

    Ⅰ.概述 今天总结RTC(Real Time Clock)实时时钟相关的知识,顺带将BKP简单总结一下. STM32的RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待 ...

  7. Requests:Python HTTP Module学习笔记(一)(转)

    Requests:Python HTTP Module学习笔记(一) 在学习用python写爬虫的时候用到了Requests这个Http网络库,这个库简单好用并且功能强大,完全可以代替python的标 ...

  8. Red Gate Software 软件推荐

    这家公司的Wiki http://en.wikipedia.org/wiki/Redgate http://www.red-gate.com/products/ 好吧 就介绍点免费的 Find SQL ...

  9. linux 病毒 sfewfesfs

    由于昨天在内网服务器A不小心rm -fr / ,导致服务器A完蛋,重装系统后,不知道啥原因,局域网瘫痪不能上网,最后发现内网服务器A的一个进程sfewfesfs cpu 300%.路由器被网络阻塞啦. ...

  10. o2o的一些看法

    最近一段时间o2o(online to offline)真是越来越来热了,尤其是微信支持支付功能之后.现在随便哪个地方都可以看到二维码,然后手机一扫就可以看到跑到线上看到卖家一些产品信息了.看到这里面 ...