Maven管理的Spring Web项目集成JUnit单元测试

JUnit是一套优秀的单元测试框架,而Maven是优秀的Java项目构建和管理工具,两者结合可以很方便地对项目进行自动化测试

  一般的简单Java应用就不多说了,一些框架会提供针对junit的扩展,使得测试变得更容易,例如Spring官方就提供了spring-test,用于提供获取ApplicationContext等方面的支持。

  首先要做的是,改变JUnit的实际执行类,将默认的执行类Suite替换为Spring提供的SpringJUnit4ClassRunner,也就是在测试类前面加上一个注解:

  @RunWith(SpringJUnit4ClassRunner.class)

  然后,我们需要告诉这个测试类Spring配置文件的位置:

@ContextConfiguration(locations={"classpath:applicationContext.xml",

"classpath:applicationContext-security.xml","file:src/main/webapp/WEB-INF/servlet.xml"})

  笔者这里展示了两种配置文件路径的写法。前两个是spring常见的配置文件,放在classpath根目录下,而“file”开头的路径是完全限定路径,默认是相对于实际的项目路径的,例如笔者使用Eclipse进行开发,这个路径的写法是相对于项目文件所在文件夹的根目录的。该写法适用于没有直接放在classpath下的一些web相关的配置文件,例如本例展示的就是放在常见的WEB-INF目录下的一个文件。

  基于以上描述,笔者写了一个Spring测试基类:


package com.test.basic;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.junit.Before;

import org.junit.runner.RunWith;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations={/*"file:src/main/webapp/WEB-INF/wxiot-servlet.xml",*/ "classpath:applicationContext.xml",

"classpath:applicationContext-security.xml"})

public classTestBase {

protected Log logger = LogFactory.getLog(TestBase.class);

@Before

//一些公用的“初始化”代码

public void before(){

}

}

  有了这个基类,我们就可以动手写各个模块的测试类了,只要在定义测试类的时候继承TestBase,并在具体的方法前面加上@Test注解,笔者这里给出一个测试类的简单示例:


import org.junit.Assert;

import org.junit.Test;

import org.springframework.beans.factory.annotation.Autowired;

import com.reports.util.ActiveMQSender;

import com.test.basic.TestBase;

public classActiveMQSenderTest extends TestBase {

@Autowired

ActiveMQSendersender;

@Test

public void sendQTest(){

Assert.assertNull(sender.sendInformationQ("发,布。到?队!列“的¥信息", "20131023102122", "20131025102122"));

Assert.assertNotNull(sender.sendInformationQ("发,布。到?队!列“的¥信息", "20131023102122", "2013-10-26 10:21:22"));

}

@Test

public void sendTopicTest(){

Assert.assertNull(sender.sendInformationTopic("发,布。到?Topic!的”信¥息", "20131023102122","20131025102122") );

}

}

  最后执行“RunAs -> JUnit Test”即可开始JUnit单元测试了,使用Maven命令还可以方便地对特定目录下(通常是src/test/java目录)的所有测试类进行批量测试。

  对于Java Web项目,某些业务类可能会带有使用ServletContext等Web容器相关类的代码,对于这些类我们就不能直接用JUnit来测试了,因为默认JUnit是没有Web容器的,我们通常需要借助其它相关的辅助类或者模拟Web容器来进行测试,例如利用struts2-junit-plugin的帮助来测试struts的action,这些内容网上的资料很多,不在本文的讨论范围之内。

  一些用到了web容器的业务类只需稍加修改,就可以直接用于JUnit测试。假设一个业务类使用了ServletContext来获取容器内的资源,例如一个配置文件:

  InputStream is=context.getResourceAsStream("/WEB-INF/configs/command-sender.xml");

  其中context变量保存了Web容器的ServletContext,如果直接使用JUnit来测试,必然导致空指针异常。此时我们可以稍作修改:


InputStream is = null;

if(null != context){

is= context.getResourceAsStream("/WEB-INF/configs/command-sender.xml");

}else{//JUnit Test环境下,使用ApplicationContext获取配置文件

//NearEast 2013-10-22

try {

is= SpringContextHolder.getApplicationContext().

getResource("file:src/main/webapp/WEB-INF/configs/command-sender.xml").getInputStream();

}catch(IOException e) {

e.printStackTrace();

}

}

  其中,SpringContextHolder是笔者在《在Java Web应用中获取Spring管理的Bean的方法》提到的一个工具类,SpringContextHolder.getApplicationContext()即获得Spring的ApplicationContext。资源的路径使用了上文提到的完全限定路径,我们也可以将其写为类似“file:E:/Workspaces/workspace_test/test/src/main/webapp/WEB-INF/configs/command-sender.xml"”的形式。经过上述修改之后,我们的业务类也可以直接利用JUnit执行测试了。

  当然我们还可以用其它方式获取ApplicationContext,例如让业务类实现ApplicationContextAware接口,并使用一个变量保存ApplicationContext。

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-08-22 08:04:46

Maven管理的Spring Web项目集成JUnit单元测试的相关文章

maven管理的java web项目怎么用cxf把接口暴露出来

问题描述 maven管理的java web项目怎么用cxf把接口暴露出来 我有一个完整的java Web 项目,可以运行成功,但是现在有需要把其中的接口暴露出来,这就有问题了,我加了@webservice,但是当我在applicationContext.xml 中配置时,例如我添加这样的代码: 还有就是我添加:http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd后再写jaxws:endpoint/jaxws:end

Intellij IDEA 构建Spring Web项目 — 用户登录功能

原文:Intellij IDEA 构建Spring Web项目 - 用户登录功能 相关软件: 1.Intellij IDEA14:http://pan.baidu.com/s/1nu16VyD 2.JDK7:http://pan.baidu.com/s/1dEstJ5f 3.Tomcat(apache-tomcat-6.0.43):http://pan.baidu.com/s/1kUwReQF 4.MySQL(mysql-essential-5.1.68-winx64):http://pan.b

Intellij IDEA 快速创建Spring Web 项目

原文:Intellij IDEA 快速创建Spring Web 项目 相关软件: Intellij Idea14:http://pan.baidu.com/s/1nu16VyD JDK7:http://pan.baidu.com/s/1dEstJ5f Tomcat(apache-tomcat-6.0.43):http://pan.baidu.com/s/1kUwReQF Spring 3.x : http://pan.baidu.com/s/1o7i8daM   创建Spring项目有两种方式,

JAVA WEB项目集成海康SDK

问题描述 JAVA WEB项目集成海康SDK JAVA WEB项目中如何在JSP页面中回放.下载远程服务器上的海康的历史监控视频?哪位大侠有做过啊,最好能直接通过JS调用相关插件的方法就可以实现的,如果有示例代码就最好了,或者有已封装好的SDK也可以.跪谢.....注:是杭州海康威视的 解决方案 http://wenku.baidu.com/link?url=pWQbROcXrpDc6BJjugglypiHwzYfmc0a394gHE2okQUqUoL5FEPcXwkMg4cS2nlSi9uo7

eclipse上搭建maven多模块Java Web项目

1.模块化需求及项目模块说明 手头上有个已上线的系统,但因老板的特殊要求,系统需要不断的修改.还有就是公司市场部不定期地在举行一些微信活动,每一个活动都是周期性的,活动完了这个功能就要在系统中移除. 系统中就有三种模块:已经在系统中正常运行不需要再变更的模块.经常性变更的模块.用完就要移除的活动模块. 所以,我们需要把项目分成了下面几个模块. 简单说明一下: timetable-common是常用工具包存放的模块. wechat-api是微信接口模块,此模块用到了timetable-common

Maven 使用Eclipse构建Web项目

使用Maven构建Web项目(Eclipse) 1:打开Eclipse 2:创建Maven项目,选择archetype-webapp模板 3:解决Servlet没有生命依赖的问题,在pom.xml中添加servlet的依赖,可以去中央仓库选择servlet版本 例如: <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> &

Java Groovlets和普通的Web项目集成

由于Groovy动态语言的方便性,如果想在普通的web项目中集成有两个选择 使用基于groovy的Grails框架,非常的方便,适用于新建的项目 使用groovy本身集成,适用已有项目的维护(毕竟按照grails的约定升级一个项目对于大的项目还是有很多的工作量的) 下文把实际涉及的一个项目维护使用groovy的过程总结一下: Web.xml配置:加入groovy响应的servlet <servlet> <servlet-name>Groovy</servlet-name>

SpringMVC,MyBatis项目中兼容Oracle和MySql的解决方案及其项目环境搭建配置、web项目中的单元测试写法、HttpClient调用post请求等案例

 要搭建的项目的项目结构如下(使用的框架为:Spring.SpingMVC.MyBatis): 2.pom.xml中的配置如下(注意,本工程分为几个小的子工程,另外两个工程最终是jar包): 其中pom.xml中的内容如下,其中${ip}为ip地址: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"

Intellij IDEA采用Maven+Spring MVC+Hibernate的架构搭建一个java web项目

原文:Java web 项目搭建 Java web 项目搭建 简介 在上一节java web环境搭建中,我们配置了开发java web项目最基本的环境,现在我们将采用Spring MVC+Spring+Hibernate的架构搭建一个java web项目 Spring MVC+Spring+Hibernate结构介绍如下: Spring MVCSpring MVC的职责是作为web层框架,实现了我们常见的MVC模式 SpringSpring 作为服务层,利用自身特性IOC.AOP,提供数据从DA