在web项目中用junit写单元测试
经过了3年的项目开发后,今年我终于换了一家公司,在找工作期间也不断充电,看了看书,什么敏捷开发之类的,且不谈敏捷开发方式,单说一下其中需要用到的单元测试这一条,我认为的确有用,只是看过了有关敏捷开发的书之后才知道,原来单元测试不仅是做测试用的,因为自己总认为自己是开发人员,不是做测试的,因此对不是开发的活就不感兴趣了,实际上,单元测试的用途除了用于测试系统某个部分的功能正常外,还有帮助开发人员进行代码重构的功能以及可以作为学习api的功能等。
进入新公司后,由于一开始并不很紧,我就琢磨着把单元测试引入到项目中来,吃一回螃蟹。但是第一次做并不容易,如果仅仅是做某个类的某个方法的单元测试应该很简单,只要写一个XXXTest类,继承TestCase类就可以了,然后就去写断言,但是实际工作中,我是在一个spring+hibernate的web工程中进行开发的,工程中的类都是由spring注入的,数据库层也都是通过spring+hibernate集成的,因此又遇到如何得到spring中的bean的问题,在项目中不让上网,因此只能抽空上网搜一堆东西去看,其实spring也集成了junit进来,org.springframework.test包中就有可以用于测试spring中的类的接口、抽象类等。
在项目中,我继承了org.springframework.test.AbstractDependencyInjectionSpringContextTests类,这个类的作用就是可以使继承了这个类的子类得到需要的spring中配置的bean。代码示例如下:
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
/**
*
* 测试抽象类,所有本项目中需要从spring得到bean的测试类均需继承
*
*/
public class AbstractTest extends AbstractDependencyInjectionSpringContextTests {
/**
* 如有其他需要初始化的变量,可以覆盖本方法
*/
public void initVariables() {
}
public void onSetUp() {
initProject();//初始化项目的参数
}
public void initProject() {
ConfigurableApplicationContext ac = this.applicationContext;
com.mycompany.core.util.SpringBeansGetter.wac = ac;
ParameterManager.CACHE = false;
// - 配置文件路径设置 -------------------------
ParameterManager.PARAMETER = "file:WebRoot/WEB-INF/classes/Parameters.xml";
}
public String[] getConfigLocations() {
String[] configLocations = {
"classpath:spring/context-adapter.xml",
"classpath:spring/context-app.xml",
"classpath:spring/context-base.xml",
"classpath:spring/context-pub.xml",
"classpath:spring/context-task.xml" };
return configLocations;
}
/**
* 得到spring中的bean
*
* @param beanId
* @return
*/
public Object getBean(String beanId) {
Object bean = com.mycompany.core.util.SpringBeansGetter.getBean(beanId);
return bean;
}
}
继承AbstractDependencyInjectionSpringContextTests 类后,需要覆盖getConfigLocations方法,在这个方法中把需要得到bean的spring配置文件的位置放入数组中即可,onSetUp方法类似于junit中的setUp方法。由于项目中有一些地方我们采用的是通过spring上下文得到bean的方式,通过覆盖getConfigLocations方法就可以初始化上下文,从而得到bean。
在具体写单元测试的时候,我只要继承我AbstractTest类,就可以得到spring配置中的bean,进行单元测试了,示例一下:
package cn.mycompany.mdms.scheduler.service;
import java.text.ParseException;
import java.util.Map;
import org.quartz.CronTrigger;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import cn.mycompany.mdms.AbstractTest;
/**
* AutoScanServiceImpl测试类
*
*/
public class SchedulerServiceImplTest extends AbstractTest {
ISchedulerService schedulerService;
Scheduler scheduler;
public void initVariables() {
scheduler = (Scheduler) getBean("scheduler");
schedulerService = (ISchedulerService) getBean("schedulerService");
}
public void testGetSchedulerStates() throws SchedulerException,
ParseException {
Map schedulerStates = schedulerService.getSchedulerStates();
JobTriggerVo jobTriggerVo = (JobTriggerVo) schedulerStates
.get("monitorDirJob-autoscan");
String[] triggerStates = jobTriggerVo.getTriggerStates();
Trigger[] triggersOfJob = jobTriggerVo.getTriggersOfJob();
this.logger.info("" + triggerStates.length);
this.logger.info(schedulerStates.keySet());
}
}
解决了在web工程中通过spring得到bean的问题,在工程中写单元测试就和给普通的类写单元测试类似了,其实spring还提供了其他一些测试抽象类用于继承,网上很好找到相关介绍,我这里罗列一下:
1、AbstractSpringContextTests类[1],该类全部方法是protected的,
通常不使用这个类,而使用它的子类们
2、AbstractDependencyInjectionSpringContextTests类[2]:继承于类[1]:名字N长的。
如果仅仅使用Spring依赖注入功能,可以让测试用例继承该类。
3、AbstractTransactionalSpringContextTests类[3]:继承于类[2],
继承该类的测试用例在spring管理的事务中进行,测试完后对数据库的记录不会造成任何影响。
你对数据库进行一些操作后,它会自动把数据库回滚,这样就保证了你的测试对于环境没有任何影响
4、AbstractTransactionalDataSourceSpringContextTests:继承于类[3],
功能更强大,用于测试持久层组件,看其源代码,
有一行"protected JdbcTemplate jdbcTemplate;",提供了一个JdbcTemplate的变量,
通过该对象可以直接操作数据库。
通过引入单元测试,我在开发中的确体会到了重构和单元测试的关系,通过编写单元测试可以大大提高重构代码的效率,当然首先保证了代码质量。估计航天系统也是通过一项项的单元测试作为基础才能有把握的进行下一步设计、组装。
分享到:
相关推荐
单元测试之道(Java):使用JUnit进行单元测试。单元测试是提高代码质量的有效手段,但大部分开发人员由于种种原因都不乐意进行单元测试。
Junit单元测试Junit单元测试Junit单元测试Junit单元测试
多数Java的开发环境都已经集成了JUnit作为单元测试的工具。 [1] JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为...
Junit单元测试Junit单元测试Junit单元测试Junit单元测试
在Eclipse中使用JUnit4进行单元测试!
junit3 junit4 api,单元测试的利器
junit单元测试junit单元测试junit单元测试
用Junit进行单元测试
junit4单元测试工具
简单介绍了Junit的安装过程与实例应用。应用的问题是软件测试中的佣兵问题,整个文档中有代码及测试结果,可以更好地帮助学生了解Junit单元测试中的作用。
使用JUnit进行单元测试PPT Spring 基于Aspectj 进行AOP编程的知识。 Aspectj快速参考文档
JUNIT软件测试软件测试技术JUnit和单元测试入门简介软件测试1、几个相关的概念白盒测试——把测试对象看作一个打开的盒子,程序内部的逻辑结构和其他信息对测试人员是公开的。回归测试——软件或环境的修复或更正后...
java web 开发中,利用Struts+Spring+Hibernate框架开发网页后的测试
java开发必备技能Junit 单元测试,适合新手的入门教程!
用Junit进行单元测试
上下文时间软件测试中Junit单元测试实例在一种传统的结构化编程语言中,比如C,要进行测试的单元一般是函数或子过程。在象C++这样的面向对象的语言中,要进行测试的基本单元是类。对Ada语言来说,开发人员可以选择是...
在Eclipse中使用JUnit4进行单元测试 在Eclipse中使用JUnit4进行单元测试
★测试夹具:(Test Fixture):就是测试运行程序会在测试方法之前自动初始化、回收资源的工作。 Junit4引入的是类级别的夹具,编写规范如下: ①创建测试用例的实例 ②使用注解BeforeClass修饰用于初始化夹具的方法 ...
Junit单元测试指南 Junit单元测试指南 Junit单元测试指南 Junit单元测试指南 Junit单元测试指南 Junit单元测试指南
SpringBoot使用Junit进行单元测试,对如何在Springboot中使用Junit进行单元测试提供示例。