引言

  是否在程序运行时使用单元测试是衡量一个程序员素质的一个重要指标。使用单元测试既可以让我检查程序逻辑的正确性还可以让我们减少程序测试的BUG,便于调试可以提高我们写程序的效率。以前我们做单元测试的时候使用的都是JUnit,只需要引入相关的jar包即可。可是我们在使用Spring的时候是不是也可以使用单元测试呢,答案是肯定的。Spring自己整合了JUint,极大的方便了我们的程序开发。

  1.引入相关环境

  如果我们想要使用Spring提供的单元测试功能,我们除了引入Spring的相关环境我们还需要引入spring单元测试的jar包,使用maven配置是

  

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>3.2.10.RELEASE</version>
</dependency></span>

  2.使用示例

  我们紧接着上次的实验结果,上次我们是通过FactoryBean的方式来加载Spring的环境并且实现了注入功能,那我们能不能直接通过单元测试的方式来实现的,看下面的例子:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import service.Hello; import javax.annotation.Resource; @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:applicationContext.xml"})
public class TestDemo2 { @Resource
Hello hello; @Test
public void testHello(){
hello.sayHello();
hello.sayGoodbye();
}
}

  运行结果:

通过上面的单元测试我们直接测试了我们Service类的功能了。

3.注解解释

  

  @RunWith(SpringJUnit4ClassRunner.class)//指定测试用例的运行器,这里是指定了

@ContextConfiguration({"classpath:applicationContext.xml"})//将spring配置加载进来,可以加载多个,使用数组,可是是classpath路径也可以是File文件路径
@Resource//注入相应的类,注入到Spring的IOC容器中然后就可以直接使用了。(按类型注入)

@Autowied//注入相应的类,功能和@Resource是一样的 @Test//标记这是一个单元测试方法,每个单元测试方法上面都需要加上此注解 除了上面几个注解,Spring单元测试中很多很用的注解下面一次介绍, @Before//在每个测试用例方法之前都会执行,位置在方法的上面  @After//在每个测试用例方法之后都会执行,位置在方法的上面  如果我们测试单元中涉及到事务处理我们是否有办法解决或者是提供支持呢,Spring的单元测试提供了对这些功能的支持。主要是通过以下几个注解来实现的:


@Transactional //对所有的测试方法都使用事务,并在测试完成后回滚事务,这个注解的功能和所处的位置有关系,如果@Transactional所处的位置在类的上面那么就是说对多有的单元测试方法都会使用事务,但是如果是在某一个测试方法的上面那么就只对这个方法才会使用事务,方法执行完毕后默认是进行事务回滚的。

@Rollback(false) //这里设置为false,就让事务不回滚 。如果们在添加了事务支持后不想要事务回滚我们只需要在相应的位置处添加上这个注解即可。如果true表示事务回滚,默认是true。 

4.其他

 

  上面的注解功能基本上可以满足我们的需求了,如果我们不知道@ContextConfiguration注解的功能,我们应该采用上面方式来注入Spring的配置呢。看下面的两个测试例子:UnitTestBase.java


  

import org.junit.After;
import org.junit.Before;
import org.springframework.beans.BeansException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.StringUtils; public class UnitTestBase { private ClassPathXmlApplicationContext context; private String springXmlpath; public UnitTestBase() {} public UnitTestBase(String springXmlpath) {
this.springXmlpath = springXmlpath;
} @Before
public void before() {
if (StringUtils.isEmpty(springXmlpath)) {
springXmlpath = "classpath*:applicationContext.xml";
}
try {
context = new ClassPathXmlApplicationContext(springXmlpath.split("[,\\s]+"));
context.start();
} catch (BeansException e) {
e.printStackTrace();
}
} @After
public void after() {
context.destroy();
} @SuppressWarnings("unchecked")
protected <T extends Object> T getBean(String beanId) {
try {
return (T)context.getBean(beanId);
} catch (BeansException e) {
e.printStackTrace();
return null;
}
} protected <T extends Object> T getBean(Class<T> clazz) {
try {
return context.getBean(clazz);
} catch (BeansException e) {
e.printStackTrace();
return null;
}
} }
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.imooc.ioc.interfaces.OneInterface;
import com.imooc.test.base.UnitTestBase; @RunWith(SpringJUnit4ClassRunner.class)
public class TestSpringUnit extends UnitTestBase { public TestSpringUnit() {
super("classpath*:applicationContext.xml");
} @Test
public void testSay() {
Hello hello = super.getBean("hello");
hello.sayHello();
} }

   由此可见我们这样可以对测试单元进行简单的封装,将一些需要的校验放到@Before中去。通过工具类提供的getBean接口一样可以获取到我们需要的Bean,只是他只是对Spring的FactoryBean进行了一层封装而已。在开发中我们应该直接使用第一种就可以了。

5.感想

  为了程序的健壮性也是最自己代码的负责人我们需要更多的使用单元测试,这是一个很好地习惯。在使用Spring整合的单元测试时多使用注解可以提交工作效率。

Spring之单元测试的更多相关文章

  1. Spring Boot单元测试(Mock)

    Spring Boot单元测试(Mock) Java个人学习心得 2017-08-12 16:07 Mock 单元测试的重要性就不多说了,我这边的工程一般都是Spring Boot+Mybatis(详 ...

  2. Spring MVC学习总结(1)——Spring MVC单元测试

    关于spring MVC单元测试常规的方法则是启动WEB服务器,测试出错 ,停掉WEB 改代码,重启WEB,测试,大量的时间都浪费在WEB服务器的启动上,下面介绍个实用的方法,spring MVC单元 ...

  3. Spring Boot 单元测试示例

    Spring 框架提供了一个专门的测试模块(spring-test),用于应用程序的单元测试. 在 Spring Boot 中,你可以通过spring-boot-starter-test启动器快速开启 ...

  4. spring的单元测试

    如果spring 4.3.18这个版本的spring要使用junit,需要使用junit的junit-4.12之上的版本.使用这个版本junit的时 候需要引入hamcrest-all的jar包.之前 ...

  5. 使用Junit对Spring进行单元测试实战小结

    Demo代码: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath*:/ ...

  6. web工程spring+ibatis单元测试

    web工程spring+ibatis在本地做单元测试,用例如下: package wanghongye; import org.junit.Before; import org.junit.Test; ...

  7. spring boot单元测试(转)

    Junit这种老技术,现在又拿出来说,不为别的,某种程度上来说,更是为了要说明它在项目中的重要性.凭本人的感觉和经验来说,在项目中完全按标准都写Junit用例覆盖大部分业务代码的,应该不会超过一半. ...

  8. Spring Controller单元测试

    SpringMVC controller测试较简单,从功能角度划分,可分为两种.一种是调用请求路径测试,另一种是直接调用Controller方法测试. 调用请求路径测试 通过请求路径调用,请求需要经过 ...

  9. Spring+JUnit4单元测试入门

    (一).JUnit介绍 JUnit是Java中最有名的单元测试框架,多数Java的开发环境都已经集成了JUnit作为单元测试的工具.好的单元测试能极大的提高开发效率和代码质量. Maven导入juni ...

随机推荐

  1. JNDI-j2ee

    Database Connection Pool (DBCP) Configurations The default database connection pool implementation i ...

  2. 理解git经常使用命令原理

    git不同于类似SVN这样的版本号管理系统,尽管熟悉经常使用的操作就能够满足大部分需求,但为了在遇到麻烦时不至于靠蛮力去尝试,了解git的原理还是非常有必要. 文件 通过git管理的文件版本号信息所有 ...

  3. Vertica对于所计算的时间SQL声明大全

    词:强.大.所有,强烈推荐 SQL语句 查询结果 select (timestamp '2005-01-17 10:00' - timestamp '2005-01-01'); 16 10:10 se ...

  4. bootstrap+jQuery.validate

    bootstrap+jQuery.validate表单校验   谈谈表单校验 这大概是一种惯例,学习前台后台最开始接触的业务都是用户注册和登录.现在社会坚持以人为本的理念,在网站开发过程同样如此.Us ...

  5. 北京设计模式学习组bjdp.org第7次活动(2013.08.04)回顾会纪要

    时间:2013.08.04,9am-7pm 地点:北京龙泉寺(北京凤凰岭风景区内) 参加人数:北京龙泉寺信息中心(20人).北京设计模式学习组(9人) 活动要点: 1)寺院巡礼:义工师兄带领参观寺院. ...

  6. Grunt 之 Connect

    前端开发 Grunt 之 Connect 在前端开发过程中,我们需要在开发过程中,将开发中的站点部署到服务器上,然后,在浏览器中查看实际的效果,在 Grunt 环境下,可以直接使用集成在 Grunt ...

  7. UOJ #5. 【NOI2014】动物园 扩大KMP

    第一次NOI称号. ... 扩展假设知道KMP如果. .. . 就是水题了. ... #5. [NOI2014]动物园 统计提交情况 描写叙述 提交 近日.园长发现动物园中好吃懒做的动物越来越多了.比 ...

  8. 【年终分享】彩票数据预测算法(一):离散型马尔可夫链模型实现【附C#代码】

    原文:[年终分享]彩票数据预测算法(一):离散型马尔可夫链模型实现[附C#代码] 前言:彩票是一个坑,千万不要往里面跳.任何预测彩票的方法都不可能100%,都只能说比你盲目去买要多那么一些机会而已. ...

  9. 关于ACM,关于CSU

    原文地址:http://tieba.baidu.com/p/2432943599 前言: 即将进入研二,ACM的事情也渐渐远去,记忆终将模糊,但那段奋斗永远让人热血沸腾.开个贴讲讲ACM与中南的故事, ...

  10. HDU1051 Wooden Sticks 【贪婪】

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...