`

在web项目中用junit写单元测试

阅读更多

在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的变量,
通过该对象可以直接操作数据库。

      通过引入单元测试,我在开发中的确体会到了重构和单元测试的关系,通过编写单元测试可以大大提高重构代码的效率,当然首先保证了代码质量。估计航天系统也是通过一项项的单元测试作为基础才能有把握的进行下一步设计、组装。

分享到:
评论
4 楼 zhenglu119 2013-04-25  
AbstractDependencyInjectionSpringContextTests都已经废弃不用了呀。建议不要这样用了
3 楼 dayang2001911 2008-10-14  
sg552 写道

恩。Spring 的 UnitTest的父类做的非常不错不过单元测试还不仅仅是IOC相关的。建议LZ多看看appfuse中全面的单元测试思路吧。相信你会跟我一样有所启发。 :)

多谢指点
2 楼 sg552 2008-10-14  
恩。
Spring 的 UnitTest的父类做的非常不错

不过单元测试还不仅仅是IOC相关的。

建议LZ多看看appfuse中全面的单元测试思路吧。

相信你会跟我一样有所启发。 :)
1 楼 Enjoyjavaeye 2008-10-07  
很好  很强大  学习了

相关推荐

    软件测试练习题很经典.docx

    8. `TestSuite` 在 JUNIT 中用于集成多个测试用例,便于执行一系列测试。 9. 测试类的命名一般要求以 `Test` 结尾,前接类名称,如:`PersonTest`。 10. 初始化被测试对象通常在测试类的 `setUp()` 方法中进行,这是...

    Java Web项目-物资管理系统项目源码.zip

    8. **测试**:单元测试和集成测试可能通过JUnit或Mockito等工具进行,确保代码的质量和功能的正确性。 9. **项目结构**:合理的项目结构对于大型Java Web项目至关重要。通常包含src/main/java(Java源代码)、src/...

    Java WEb项目

    8. **测试与部署**:单元测试、集成测试和系统测试确保代码质量,JUnit和Mockito等工具可辅助测试。部署方面,项目可能运行在Tomcat、Jetty等应用服务器上,通过Nginx或Apache进行负载均衡和反向代理。 9. **持续...

    jetty简单启动web服务

    例如,如果你的Web服务依赖于某个外部API,你可以在测试中用一个返回固定响应的Servlet来代替那个API。 总结,Jetty提供了一种简单高效的方式来启动和测试Web服务,无论是简单的"Hello, World!"应用还是复杂的...

    计算机毕业设计-网上订餐系统-Java Web项目源码.zip

    9. **单元测试与集成测试**:JUnit和Mockito等工具可能被用来编写测试用例,验证各模块的功能和交互,确保系统的稳定性。 10. **版本控制**:Git可能是项目开发过程中的版本控制系统,帮助团队协作,追踪代码变更。...

    Java Web电子邮件模块.rar

    6. 测试类:使用JUnit进行单元测试。 7. Maven或Gradle构建文件:管理项目的依赖和构建过程。 综上所述,Java Web电子邮件模块是一个综合性的项目,涵盖了Web开发、JavaMail API、数据库操作、前端技术等多个方面,...

    java web 在线考试系统

    14. **单元测试与集成测试**:JUnit可能是进行单元测试的工具,而Selenium可能用于模拟用户行为进行Web应用的集成测试。 15. **版本控制**:如Git,用于代码版本管理,协同开发。 这个在线考试系统可能还包括试题...

    实战突击 JavaWeb 项目整合开发4

    10. **测试**: 了解单元测试(JUnit)、集成测试(Spring Boot Test)和端到端测试(Selenium)等测试框架,确保代码的质量和系统的稳定性。 以上是“实战突击 JavaWeb 项目整合开发4”中的核心知识点。通过深入...

    Java毕业设计-花店-源代码

    JUnit是Java中常用的单元测试框架,而Mockito则可以帮助模拟协作对象,进行隔离测试。 以上就是《Java毕业设计-花店-源代码》项目中可能涉及的主要技术点和知识点,通过这个项目,学习者可以提升自己的Java编程技能...

    spring-test-examples:这是包含我在Spring教程中测试的示例的存储库

    JUnit5是这个项目中用到的测试框架,它是Java领域最流行的单元测试工具。相比于之前的JUnit4,JUnit5引入了新的注解、测试生命周期和扩展机制。例如,`@Test`定义测试方法,`@DisplayName`用于设置测试方法的显示...

    Koder,.zip

    7. **测试框架**:Kotlin提供了JUnit和MockK等测试框架,用于编写单元测试和集成测试。Koder的源码中可能包含这些测试代码,确保代码的质量和功能的正确性。 通过深入研究Koder项目,开发者不仅可以学习到Kotlin...

    Packtpub-Apache Struts 2 Web Application Development(2009).rar

    对于单元测试和集成测试,书中有专门的章节介绍如何使用JUnit和Mock Objects与Struts 2协同工作,以确保应用的稳定性和质量。 最后,讨论了Struts 2的插件系统,如Struts 2与Spring框架的整合,这使得依赖注入和AOP...

    javaweb开发的学习路线

    - **单元测试:**学会使用 JUnit 进行单元测试,提高代码质量。 - **持续集成/持续部署(CI/CD):**了解 Jenkins 等工具在自动化构建和部署中的应用。 通过以上各个阶段的学习,可以系统地掌握 JavaWeb 开发所需的...

    javaweb期末大作业:制作一个房屋销售平台

    【JavaWeb 房屋销售平台】是一个典型的Web应用程序开发项目,旨在模拟实际的房地产交易环境,让学生在实践中学习和掌握JavaWeb技术。这个项目涵盖了多种关键技术和概念,包括前端界面设计、后端业务逻辑处理、数据库...

    基于Java商品管理系统.zip

    8. **单元测试**: 使用JUnit进行单元测试,确保代码的功能正确性,这是软件开发过程中的重要环节。 9. **异常处理**: Java的异常处理机制(try-catch-finally)在程序中用于捕获和处理可能出现的问题,保证系统的...

    springboot507基于Springboot教学管理系统pf.zip

    9. **单元测试与集成测试**:Spring Boot提供了JUnit和Mockito等测试支持,开发者可能为系统编写了单元测试和集成测试,以确保代码的质量和系统的稳定性。 10. **Docker化部署**:考虑到生产环境的部署,项目可能还...

    jsp 山海关欢乐海洋公园软件源代码.zip

    6. **测试文件**:可能包含JUnit测试用例,用于验证代码功能的正确性。 通过分析这个项目,我们可以学习到JSP如何与Java Servlet协作处理请求,如何组织MVC(Model-View-Controller)架构,以及如何利用JDBC进行...

    grouptherapy-源码.rar

    5. **测试框架**:为了保证代码质量,项目可能包含了单元测试和集成测试,如JUnit、pytest、Jest或Appium。 6. **配置文件**:项目可能包含各种配置文件,如application.properties(Java)、settings.py(Python)...

    基于springboot校园疫情防控系统.zip

    9. **单元测试与集成测试**:利用JUnit或其他测试框架进行代码测试,确保功能的正确性。 10. **持续集成/持续部署(CI/CD)**:可能采用Jenkins、GitLab CI/CD等工具,实现自动化构建和部署。 这个项目作为毕业设计...

Global site tag (gtag.js) - Google Analytics