Spring回顾之五 —— 测试,JUnit与SpringTest的完美结合

9 篇文章 0 订阅
1 篇文章 0 订阅
[size=medium] 没有测试的程序,是不完整的,每一个从事写程序的人员,都应该坚持做单元测试,通过单元测试可以验证程序基本功能的有效性,从而保证整个系统的质量,功在一时,利在千秋。这里我们将尝试使用Junit和SpringTest,在之前的系统里添加测试功能。[/size]

[b][size=large]第一步:JUnit与SpringTest的引入[/size][/b]
[size=medium] JUnit故名知意,是一个专门为Java语言提供单元测试的框架。平时的开发过程中,单元测试会频繁的用到,所以在JUnit之上,Spring又做了进一步的封装,这个集成的测试模块也就是SpringTest。
SpringTest的使用可以避免频繁、重复的容器加载,这个使用起来会有很好的体验。它还可以不用像JUnit那样通过getBean()方法去容器里获取目标元素,直接就像在实际开发中一样,做好配置,写好标签就可以得到想要的结果。SpringTest还做了对数据库操作的回滚处理,这个在日常测试使用中相当实用,可以避免去数据库做频繁修改以确保环境正常。等等诸多,SpringTest能在强大的JUnit之上让我们更加方便的进行单元测试,来先看看他们所需的依赖包,打开pom文件,在dependencies里添加以下代码[/size]

<!-- ============== test begin ============== -->
<dependency><!-- JUnit单元测试框架 -->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency><!-- spring对测试框架的简单封装功能 -->
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<!-- ============== test end ============== -->

[size=medium] 就酱,更新系统,依赖的相应jar包会添加到系统,接下来我们写程序运行运行来看看效果。[/size]

[b][size=large]第二步:JUnit测试验证[/size][/b]
[size=medium] 我们先来看看单独使用JUnit进行测试的样子,在src/test/java下,建立准备编写测试类的包,然后创建名为JunitTestUser的测试类,代码如下[/size]

package test.demo;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import test.demo.dao.UserDAO;
import test.demo.data.User;

public class JunitTestUser {
private static final Logger logger = LoggerFactory.getLogger(JunitTestUser.class);
private UserDAO userDao;

@Before
public void init() {
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("classpath*:applicationContext.xml");
SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) classPathXmlApplicationContext.getBean("sqlSessionFactory");
SqlSession sqlSession = sqlSessionFactory.openSession();
userDao = sqlSession.getMapper(UserDAO.class);
classPathXmlApplicationContext.close();
}
@Test
public void testGetUserById() {
Integer userId = 1;
User user = userDao.getUserById(userId);
logger.info("用户的名字是 : " + user.getName());
}
}

[size=medium] 这里边顺便提一下,这里使用的ClassPathXmlApplicationContext是spring读取xml比较常用的类,也可以直接用ApplicationContext,但共同的作用都是从spring的容器中获取所需的bean,我们这里获取了配置文件中的sqlSessionFactory,然后从这个连接池冲拿到数据库会话(SqlSession),继而我们可以得到所需的dao,通过这个dao我们可以进行对数据库的操作。
这里回顾下我们的applicationContext.xml内容,估计能帮助对这段代码的理解[/size]

<?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:p="http://www.springframework.org/schema/p"
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-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd ">

<!-- 加载配置文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties" />
</bean>
<!-- ========================= ORM BEGIN ========================= -->
<!-- 数据源配置 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- 初始化连接大小 -->
<property name="initialSize" value="${jdbc.initialSize}"></property>
<!-- 连接池最大数量 -->
<property name="maxActive" value="${jdbc.maxActive}"></property>
<!-- 连接池最大空闲 -->
<property name="maxIdle" value="${jdbc.maxIdle}"></property>
<!-- 连接池最小空闲 -->
<property name="minIdle" value="${jdbc.minIdle}"></property>
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="${jdbc.maxWait}"></property>
</bean>
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件,mapperLocations的设置将会自动扫描MyBatis的xml文件-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath*:test/demo/mapper/*Mapper.xml"/>
</bean>
<!-- DAO接口所在包名,Spring会自动寻找其路径下的接口 -->
<bean id="demoDaoFactory" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="test.demo.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<!-- 数据事务管理 ( Spring允许允许 MyBatis参与到事务管理中,所以MyBatis没有特定的事务管理器,直接利用了Spring中的 DataSourceTransactionManager) -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- ========================= ORM END ========================= -->
</beans>

[size=medium] OK,测试部分的代码写完之后,我们直接右键,Run As ,选中Junit Test[/size]
[img]http://dl2.iteye.com/upload/attachment/0123/8609/848cbdb5-410d-32c7-9326-fd40270c4826.jpg[/img]

[size=medium] 然后可以看到Eclipse的Junit栏运行之后会显示出一下的绿色条带[/size]
[img]http://dl2.iteye.com/upload/attachment/0123/8611/1d9971b4-a2cd-31d6-b3ce-24ef1476070b.jpg[/img]

[size=medium] OK,这是成功的运行了代码,测试没问题,然后我们去Console栏,打印的日志里我们可以看到如下代码[/size]

16:46:14,725 INFO DruidDataSource:785 - {dataSource-1} inited
16:46:14,900 INFO JunitTestUser:30 - 用户的名字是 : tom

[size=medium] 嗯,名字tom已经被打印,好,我们已经完成用JUnit做的单元测试,下边来看看加入SpringTest是什么效果。[/size]

[b][size=large]第三步:JUnit与SpringTest共同的尝试[/size][/b]
[size=medium] 紧接着我们创建一个名为SpringTestUser的测试类,代码如下[/size]

package test.demo;

import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import test.demo.dao.UserDAO;
import test.demo.data.User;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath*:applicationContext.xml"})
public class SpringTestUser {
private static final Logger logger = LoggerFactory.getLogger(SpringTestUser.class);

@Resource
private UserDAO userDao;

@Test
public void testGetUserById() {
Integer userId = 1;
User user = userDao.getUserById(userId);
logger.info("用户的名字是 : " + user.getName());
}
}

[size=medium] 注意标签@RunWith(SpringJUnit4ClassRunner.class)说的是我们这段代码其实用的还是JUnit进行测试的。@ContextConfiguration({"classpath*:applicationContext.xml"})以标签的形式完成对配置文件的加载,接下来看代码,简直是爽爆了,简洁明了的逻辑,只要配置文件里做好了注入的配置,这里直接通过标签获取即可,OK,我们来运行下:右键,Run As ,选中Junit Test...Junit栏运行显示已经测试成功[/size]
[img]http://dl2.iteye.com/upload/attachment/0123/8613/20151e89-a788-34b5-970a-e068d96fd83b.jpg[/img]

[size=medium] 我们去Console栏的日志里可以看到如下代码[/size]

16:55:57,241 INFO DruidDataSource:785 - {dataSource-1} inited
16:55:57,457 INFO SpringTestUser:26 - 用户的名字是 : tom
16:55:57,459 INFO GenericApplicationContext:987 - Closing org.springframework.context.support.GenericApplicationContext@4667ae56: startup date [Wed Mar 22 16:55:56 CST 2017]; root of context hierarchy
16:55:57,462 INFO DruidDataSource:1514 - {dataSource-1} closed

[size=medium] OK,测试已完成![/size]

[b][size=large]第四步:小结[/size][/b]
[size=medium] 这里不想用太多华丽的词藻来吹嘘使用SpringTest带来的便利,仅仅对比代码的就可以看出,使用SpringTest的优势。实际使用过程中SpringTest集成的对事物的处理啊,对测试数据的回滚啊,仅通过一个标签就可以实现,那可是提供了实实在在的方便,感兴趣的可以试下。[/size]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值