引言

  是否在程序运行时使用单元测试是衡量一个程序员素质的一个重要指标。使用单元测试既可以让我检查程序逻辑的正确性还可以让我们减少程序测试的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. HDU 2112 HDU Today (Dijkstra算法)

    HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. Python中国的学习方式处理问题

    a = '你们' 至 str 物 a = u'你们' 至 unicode 物 1. >>> print 'u'  + '你们' >>> u欢 输出乱码 2. > ...

  3. mahout安装和测试

    Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发者更加方便快捷地创建智能应用程序.Apac ...

  4. NSIS:静默释放文件并运行 制作绿色单文件软件

    原文 NSIS:静默释放文件并运行 制作绿色单文件软件 现在所谓的绿色单文件软件,大多与以下代码原理相似:把软件运行需要的文件封装为一个EXE文件,双击时释放到某个目录(大多是TEMP)并运行主程序文 ...

  5. emacs quick open and jump file (or buffer) which name is current word

    Sometime, we need to open a file or buffer which name begin with current word in emacs. Here I give ...

  6. Linux 火狐浏览器安装Flash插入

    Linux系统安装完毕,找到Firefox浏览器和视频播放器不能总是提示安装Flash.而据火狐浏览器的提示Flash插件安装总是失败,能手动安装Flash插件啦. 到Flash官网:http://g ...

  7. 手机号ID开关星号(*)

    .h文件 <span style="font-size:18px;">/** * 转成星号工具 */ @interface AsteriskTool : NSObjec ...

  8. iOS学习笔记---简单的学习总结

    1.xcode6.0官方的版本必须是OS X10.9.4而以上的版本安装前: 2,xcode6.0正式版创建命令行项目时,无法选择swift语言:可是创建iOS应用项目时能够选择swift语言. 3, ...

  9. 背包问题 (DP)

    利用记忆化数组.记dp[i][j]为根据rec的定义,从第i个物品开始挑选总重小于j时,总价值的最大值. 递推式: dp[i][j]=0     (j<w[i]) dp[i][j] dp[i][ ...

  10. DFS-hdu-2821-Pusher

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2821 题目意思: 给一个n*n的矩阵,里面有些位置是空的,有些位置有箱子(a代表一个箱子,b代表两个 ...