Spring之单元测试
引言
是否在程序运行时使用单元测试是衡量一个程序员素质的一个重要指标。使用单元测试既可以让我检查程序逻辑的正确性还可以让我们减少程序测试的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之单元测试的更多相关文章
- Spring Boot单元测试(Mock)
Spring Boot单元测试(Mock) Java个人学习心得 2017-08-12 16:07 Mock 单元测试的重要性就不多说了,我这边的工程一般都是Spring Boot+Mybatis(详 ...
- Spring MVC学习总结(1)——Spring MVC单元测试
关于spring MVC单元测试常规的方法则是启动WEB服务器,测试出错 ,停掉WEB 改代码,重启WEB,测试,大量的时间都浪费在WEB服务器的启动上,下面介绍个实用的方法,spring MVC单元 ...
- Spring Boot 单元测试示例
Spring 框架提供了一个专门的测试模块(spring-test),用于应用程序的单元测试. 在 Spring Boot 中,你可以通过spring-boot-starter-test启动器快速开启 ...
- spring的单元测试
如果spring 4.3.18这个版本的spring要使用junit,需要使用junit的junit-4.12之上的版本.使用这个版本junit的时 候需要引入hamcrest-all的jar包.之前 ...
- 使用Junit对Spring进行单元测试实战小结
Demo代码: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath*:/ ...
- web工程spring+ibatis单元测试
web工程spring+ibatis在本地做单元测试,用例如下: package wanghongye; import org.junit.Before; import org.junit.Test; ...
- spring boot单元测试(转)
Junit这种老技术,现在又拿出来说,不为别的,某种程度上来说,更是为了要说明它在项目中的重要性.凭本人的感觉和经验来说,在项目中完全按标准都写Junit用例覆盖大部分业务代码的,应该不会超过一半. ...
- Spring Controller单元测试
SpringMVC controller测试较简单,从功能角度划分,可分为两种.一种是调用请求路径测试,另一种是直接调用Controller方法测试. 调用请求路径测试 通过请求路径调用,请求需要经过 ...
- Spring+JUnit4单元测试入门
(一).JUnit介绍 JUnit是Java中最有名的单元测试框架,多数Java的开发环境都已经集成了JUnit作为单元测试的工具.好的单元测试能极大的提高开发效率和代码质量. Maven导入juni ...
随机推荐
- 彩色图像--色彩空间 CMY(K)场地
得知DIP文章63日 转载请注明文章出处:http://blog.csdn.net/tonyshengtan .出于尊重文章作者的劳动,转载请标明出处!文章代码已托管.欢迎共同开发:https://g ...
- android内置存储器memory和第三方外部存储disk管理
缓存管理这里 http://blog.csdn.net/intbird/article/details/38338713 图片处理在这里 http://blog.csdn.net/intbird/ar ...
- 变化Android系统属性SystemProperties.set("sys.powerctl", "shutdown")关机分析
基本介绍: 从以前的博客中提到,我们,最后,通过关机过程变化Android关机属性(SystemProperties.java由JNI呼叫接入系统属性),当然,我们也能adb命令变化Android系统 ...
- Content://sms
package com.example.sms; import android.app.Activity; import android.app.Notification; import androi ...
- Android项目外接高德地图代码混淆注意事项
如今好多项目中都加入了第三方jar包,可是最大的问题就是打包的时候代码混淆报错,下面是高德地图混淆报错解决方式: 在proguard-project.txt中加入例如以下代码: -libraryjar ...
- Unity + iBatis + Asp.net Mvc 系统搭建
Unity + iBatis + Asp.net Mvc 系统搭建 之前用EntityFramework Code First做了一些小项目,很是方便:后来在一个 Java 项目中接触了myBatis ...
- Sql Server之旅——第五站 确实不得不说的DBCC命令
原文:Sql Server之旅--第五站 确实不得不说的DBCC命令 今天研发中心办年会,晚上就是各自部门聚餐了,我个人喜欢喝干红,在干红中你可以体味到那种酸甜苦辣...人生何尝不是这样呢???正好 ...
- UVA - 10014 - Simple calculations (经典的数学推导题!!)
UVA - 10014 Simple calculations Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & ...
- Redhat Linux挂载NTFS格式的移动硬盘
Redhat Linux挂载NTFS格式的移动硬盘 1. 选择下载ntfs-3g的源码包或rpm包 http://www.tuxera.com/community/open-source-ntfs-3 ...
- 流动python - 八皇后问题简单解决方案
思维: 使用DFS. 坐标的一维阵列的表达,在标行,元素列.A[i]=j它表示第一i女王就行了j柱. 以穿越线,由线(从上到下),决定其列(左到右),所以,不要推断冲突的行,和主斜线副斜线冲突. (行 ...