粗糙的研究了下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. Web Service无法加载协定为“ServiceReference1.xxxxxx”的终结点配置部分,因为找到了该协定的多个终结点配置。请按名称指示首选的终结点配置部分

    Web Service 无法加载协定为“ServiceReference1.xxxxxx”的终结点配置部分,因为找到了该协定的多个终结点配置.请按名称指示首选的终结点配置部分   原因是在web.co ...

  2. 学习c语言的第9天

    #include <stdio.h> int main() { float sum=0,wage=0; int i=1; int num; printf("+++平均工资统计程序 ...

  3. 升级Mac X Mavericks MacMiv 无法启动

    今天把Mac 系统升级到了 Mac X Mavericks ,确实有不少的惊喜.虽然体验不出Mac X Mavericks拥有更强的性能/更好的电池表现,但是新版的Safari浏览器的提供了更方便的主 ...

  4. C++十进制转换为二进制

    题目内容:将十进制整数转换成二进制数. 输入描述:输入数据中含有不多于50个的整数n(-231<n<231). 输出描述:对于每个n,以11位的宽度右对齐输入n值,然后输出“-->” ...

  5. Timer wheel etc.

    http://code.google.com/p/hierarchal-wheel-timer/ 最小堆的实现(C 语言版) 最小堆的实现(java) Linux 下定时器的实现方式分析 更快bobh ...

  6. NuGet 的使用

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

  7. a 标签 跳转4种类型

    <a href=''  target=''>中的target有4种参数: '_self'   ,  '_parent'   ,  '_top'    和  '_blank' 在没有使用框架 ...

  8. [转]关于VC预定义常量_WIN32,WIN32,_WIN64

      VC2012 下写 Windows 程序时,有时需要判断编译环境.在之前的文章<判断程序是否运行在 Windows x64 系统下.>里说过如何在运行期间判断系统环境,但在编译时如何判 ...

  9. 精简配置plsql developer连接oracle

    DB:11.2.0.3.0 OS:oracle-linux 5.7 公司堡垒机为了安全重新规划,各个组只能访问各个组的堡垒机磁盘空间,因此无法访问线上oracle组的磁盘空间,导致plsql deve ...

  10. ORACLE 分区表简介

    参考链接:http://blog.csdn.net/ziwen00/article/details/9158725ORACLE-分区表 此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分 ...