最近,认真实践了单元测试Struts2、Spring等Java项目,今天特意写的是单元测试Struts2Spring项目的Action和Service。

由于已经写过不少Web开发框架单元测试的代码,加上上次从头搭建环境并发表了"单元测试Struts2的Action(包含源码) ",没有遇到太多问题。

特别说明:本文是原创,搭建环境、写代码、运行,都是实践并且正确的。

本文是靠谱的,而非简单的复制-粘贴。

1.特别说明。

http://blog.csdn.net/fansunion/article/details/12118043  单元测试Struts2的Action(包含源码)

这篇文章主要讲述的是如何 使用JUnit等单元测试框架测试 Struts2这一个框架的Action。

而本篇侧重Struts2和Spring这2个框架集成的情况。

更多框架集成的单元测试Demo文章,请关注本博客后续 单元测试相关文章。

2.新建工程,加入相关jar包。

Struts相关jar包

Spring相关jar包

JUnit, spring-test-3.2.3.RELEASE.jar,struts2-junit-plugin-2.2.3.1.jar等测试相关jar包

Tomcat的Servlet/JSP jar包

3.新建Action。

package action; 

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
/**
* 一个简单的Action。
* @author FansUnion
*
*/
@Controller
public class UserAction { @Autowired
private UserService userService; public String getName() {
userService.getName("FansUnion");
return "success";
}
}

4.新建Service。

package action; 

import org.springframework.stereotype.Service; 

@Service
public class UserService { /**
* 简单的返回用户名
*/
public String getName(String name) {
// 这个地方实际上应该调用Dao持久层的代码,在此简化了。
// 本文只是单元测试Struts2Spring整合中,Struts的Action和Spring注入的Service。
// Struts2Spring+Hibernate/Mybatis将在后续篇章中介绍。
return name;
} }

5.单元测试Action。

package unittest; 

import org.apache.struts2.StrutsSpringTestCase;
import org.junit.Test; import action.UserAction; import com.opensymphony.xwork2.ActionProxy; /**
* 测试StrutsSpring集成的时候,需要继承StrutsSpringTestCase这个类,
* 而单独测试Struts的时候,继承StrutsTestCase。
*
* @author http://blog.csdn.net/fansunion/
*
*/
public class ActionUnitTest extends StrutsSpringTestCase {
// 重写父类方法,指定配置文件的名字
protected String[] getContextLocations() {
return new String[] { "struts.xml", "applicationContext-spring.xml" };
} @Test
public void testExecute() throws Exception {
ActionProxy proxy = getActionProxy("/unitTest");
UserAction test = (UserAction) proxy.getAction();
assertNotNull(test);
String result = proxy.execute();
assertEquals("success", result);
}
}

6.单元测试Service。

package unittest; 

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.springframework.mock.web.MockServletContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.XmlWebApplicationContext; /**
* 测试Service的基类
*
* @author http://blog.csdn.net/fansunion/
*
*/
public class JUnitTestBase { public static XmlWebApplicationContext context = null; public static String[] CONFIG_FILES = { "file:src/applicationContext-*.xml" }; public JUnitTestBase() {
System.out.println("JUnitTestBase");
} @BeforeClass
public static void setUp() {
System.out.println("Test start…"); context = new XmlWebApplicationContext();
context.setConfigLocations(CONFIG_FILES); MockServletContext msc = new MockServletContext();
context.setServletContext(msc);
context.refresh();
msc.setAttribute(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,
context);
} @AfterClass
public static void tearUp() {
System.out.println("Test end!");
} } package unittest; import static org.junit.Assert.assertEquals; import org.junit.Test; import action.UserService; public class UserServiceTest extends JUnitTestBase { private UserService userService; public UserServiceTest() {
userService = context.getBean(UserService.class);
} @Test
public void test() {
String name = "http://FansUnion.cn";
String myName = userService.getName(name);
assertEquals(name, myName);
} }

7.Struts2配置。

<struts> 

 <!– Development Mode –>
<constant name="struts.devMode" value="true" />
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.objectFactory" value="spring" />
<constant name="struts.objectFactory.spring.autoWire" value="name" /> <package name="manager" namespace="/" extends="struts-default"> <action name="unitTest" class="userAction" method="getName">
<result name="success">unitTest.jsp
</result>
</action> </package>
</struts>

8.Spring配置。

(由于是从我的就项目复制类的,很多配置都可以去掉,由读者自己完成)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:flex="http://www.springframework.org/schema/flex" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/flex
classpath:/spring-flex-1.0.xsd
"> <context:annotation-config />
<context:component-scan base-package="*" />
<aop:aspectj-autoproxy />
</beans>

9.web.xml配置。

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <!– Spring Context –>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/applicationContext*.xml</param-value>
</context-param> <!– Spring Context Listener –>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> <filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter> <filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping> </web-app>

10.源码下载。

源码CSDN下载:http://download.csdn.net/detail/fansunion/6332361 (免积分)

有问题,可以留言,或加入群或者QQ。我抽空答复。

原文参见:http://FansUnion.cn/articles/2550

单元测试Struts2Spring项目的Action和Service(包含源码)的更多相关文章

  1. 单元测试Struts2的Action(包含源码)

    很久没有从头搭建Struts2的环境了.最近,认真实践了单元测试Struts2.Spring等Java项目. 今天特意写的是单元测试Struts2的Action,遇到了不少问题,果然是实践出真知啊. ...

  2. html2canvas实现浏览器截图的原理(包含源码分析的通用方法)

    DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师. 官方网站:devui.design Ng组件库:ng-devui(欢 ...

  3. Spark RDD/Core 编程 API入门系列 之rdd实战(rdd基本操作实战及transformation和action流程图)(源码)(三)

    本博文的主要内容是: 1.rdd基本操作实战 2.transformation和action流程图 3.典型的transformation和action RDD有3种操作: 1.  Trandform ...

  4. 提高生产力:发送邮件API和Web服务(包含源码)

    在Web开发中,发邮件是一种非常常见的功能或任务. 发送邮件的6种方式 一文提到了6种方法,文章发表后,有网友指出了还有另外一种方法,Ant中也可以发送邮件. 打开Foxmail之类的邮件客户端或者在 ...

  5. HanLP自然语言处理包开源(包含源码)

    支持中文分词(N-最短路分词.CRF分词.索引分词.用户自定义词典.词性标注),命名实体识别(中国人名.音译人名.日本人名.地名.实体机构名识别),关键词提取,自动摘要,短语提取,拼音转换,简繁转换, ...

  6. LSH、ITQ、SKLSH图像检索实验实现(包含源码下载地址)

    原文来自我的独立blog:http://www.yuanyong.org/blog/cv/lsh-itq-sklsh-compliment 这两天寻找idea,想来思去也没想到好点的方法,于是把前段时 ...

  7. 电子商务系统+java+web+完整项目+包含源码和数据库Java实用源码

    鸿鹄云商大型企业分布式互联网电子商务平台,推出PC+微信+APP+云服务的云商平台系统,其中包括B2B.B2C.C2C.O2O.新零售.直播电商等子平台. 分布式.微服务.云架构电子商务平台 java ...

  8. gradle 构建包含源码配置

    参考配置: apply plugin: "idea" apply plugin: "groovy" apply plugin: "eclipse&qu ...

  9. 【JavaScript游戏开发】JavaScript+HTML5封装的苏拉卡尔塔游戏(包含源码)

    /** 苏拉克尔塔游戏 * 思路: * 1.棋盘设置:使用HTML5的canvas标签绘制整个棋盘 * 2.点击事件:当页面被点击时,获取点击的x,y像素点,根据此像素点进行判断,再在合适位置绘制黑红 ...

随机推荐

  1. 原生js,时间日期简单应用。

    一.数码时钟,滚动切换时间. <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  2. 【UML】UML世界的构成

    UML概述 全名:Unified Modeling Language 中文名:统一建模语言 发展历程:"始于1997年一个OMG标准.它是一个支持模型化和软件系统开发的图形化语言,为软件开发 ...

  3. js 数组克隆

    在JS中,对于对象类型的变量的引用是通过类似C之类的"指针"的方式来操作的,及假设多个变量引用同一个对象,则随意一个变量对对象的操作都会影响到其他的变量. 这个可能不是非常明确,以 ...

  4. MYSQL Training: MySQL I

    让以admin身份登录.源代码: 非常easy的注入 在username输入 admin' OR '1'='1 OK.

  5. phpmyadmin客户端多服务器配置

    修改libraries/config.default.php 545行,添加 $cfg['Servers']['2'] = $cfg['Servers'][$i];$cfg['Servers']['2 ...

  6. 剑指offer——06旋转数组的最小数字(Python3)

    题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数 ...

  7. Spark RDD概念学习系列之RDD的本质特征

    不多说,直接上干货!

  8. 什么是CNN--Convolutional Neural Networks

    是近些年在机器视觉领域很火的模型,最先由 Yan Lecun 提出. 如果想学细节可以看 Andrej Karpathy 的 cs231n . How does it work? 给一张图片,每个圆负 ...

  9. asp实现阿里大鱼短信API接口的方法

    阿里大鱼是阿里推出的产品,官方提供JAVA..NET.PHP等版本的SDK下载,不知为何,唯独不提供ASP版本的SDK. 不提供没关系,自己写就是了,参照官方提供的API写一个就是了. 本来以为无非是 ...

  10. MySQL的几个重要配置参数详解

    .配置通用查询日志,需要在配置文件my.cnf中增加如下: () 在mysql的安装目录下,修改my.cnf配置文件,增加general_log = () 重启mysql,可执行命令/etc/init ...