`

struts2单元测试-2(使用EasyMock)

 
阅读更多

 

1、之前我们的项目struts2版本是使用struts2.1.18,他使用struts2-junit-pugin-2.1.8.1.jar进行测试的时候完全可以,而且很方便,参考地址,http://gsdhaiji-cai.iteye.com/blog/1404230

 

 

2、坑爹的是,在一个旧的系统中,同样导入struts2-junit-pugin-2.1.8.1.jar,发现不行,后来跟踪了一下源码才发现:

struts2版本是2.0.11存在:strutsTestCase这个类,它与struts2-junit-pugin-2.1.8.1.jar中strutsTestCase类冲突,而且连包名都相同,导致struts2-junit-pugin-2.1.8.1.jar这个包中的StrutsTestCase无法使用,后来直接换掉其他方式来测试。ps:有谁能告诉我方法,在struts2 2.0.11版本直接使用struts2-junit-pugin,小弟不胜感激,必定以身相许:)

 

3、使用了EasyMock方法处理[1],下载地址是

http://sourceforge.net/projects/easymock/files/EasyMock/

 

4、后来发现运行时候有一个问题,如下

 

java.lang.NoClassDefFoundError: org/objenesis/ObjenesisHelper

at org.easymock.internal.ObjenesisClassInstantiator.newInstance

需要下载下面一个jar包,

 

http://code.google.com/p/objenesis/downloads/detail?name=objenesis-1.1.jar&can=2&q=

 

5、例子:

 

1、测试基类BaseAcionTest.java(其他action的测试类,都是继承他)

 

 

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;
import org.easymock.EasyMock;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;


public class BaseActionTest {

	protected ApplicationContext context;
	protected HttpServletRequest request;
	protected HttpServletResponse response;
	
	BaseAction baseAction;
	
	public BaseActionTest() {
		context = new FileSystemXmlApplicationContext("classpath*:applicationContext-test.xml");
		this.request = EasyMock.createMock(HttpServletRequest.class);
		this.response = EasyMock.createMock(HttpServletResponse.class);
		ServletActionContext.setRequest(request);
		ServletActionContext.setResponse(response);
	}
}
 

 

2、某一个测试类

 

@Test

	public void testSave() throws IOException {

		//预期设置阶段record阶段,模拟一些初始动画
		//这一步已经在父类中定义了,他依赖与request的初始化//需要下面这样传递参数才行
		//直接使用request.addParameter();不行
                //这面这个方法,是可以避免测试程序调用ajax方法,我们直接告诉他这个方法的返回值是什么,省去ajax调用,这里注释掉
		//NetStandardAction netStandardAction = EasyMock.createMockBuilder(NetStandardAction.class).addMockedMethod("ajax").createMock();
		NetStandardAction netStandardAction = new NetStandardAction();
		EasyMock.expect(request.getParameter("name")).andReturn("hello");
		EasyMock.expect(request.getParameter("netStandardId")).andReturn("");
		this.request.setAttribute("ajaxInfo", "success");
		EasyMock.expectLastCall();
		//EasyMock.expect(netStandardAction.ajax("success")).andReturn("ajax");
		//repay,你要测试的对象放在这里,在这个阶段将record阶段的录制操作,重新运行一遍
		netStandardAction.setNetStandardService((NetStandardService)context.getBean("netStandardService"));
		EasyMock.replay(this.request);
		//EasyMock.replay(netStandardAction);
		
	    String result = netStandardAction.saveNetStandard();
	    
	    //verify阶段,用来验证我们的测试结果与交互
	    //调用了junit进行结果判断
	    //Assert.assertEquals("保存成功", "ajax", result);
	    //验证request是否按照record阶段模拟运行了
	   
	    EasyMock.verify(this.request);
	    //EasyMock.verify(netStandardAction);
	}
  

3、NetStandardAction类:

 

 

	
//此类需要spring注入netStandardService
public String saveNetStandard(){
		String netStandardId=getParam("netStandardId");
		String name=getParam("name");
		if(isEmpty(netStandardId)){
			NetStandard netStandard=new NetStandard();
			netStandard.setName(name);
			netStandardService.save(netStandard);
		}else{
			NetStandard netStandard=netStandardService.get(NetStandard.class,Integer.valueOf(netStandardId));
			netStandard.setName(name);
			netStandardService.update(netStandard);
		}
		return ajax(SUCCESS);
	}

 

 

4、上面中的ajax方法

 

  //这里的getRequest是获取当前request对象

public String ajax(String info) {
		getRequest().setAttribute("ajaxInfo",info);
		return "ajax";
	}

 

5、总结一下:

 

首先感谢参考资料中的作者,他的文档太给力了:)

        需要明白以下内容:

        record->replay->verify这个过程

谁要事先录制(依赖的对象——次要测试对象,你用mock来模拟),测试对象(主要测试对象)

        对于方法调用的顺序,要看:strict和nice这一节

对于有返回值和没有返回值,你需要怎么写

 

参考资料:

[1]:http://www.iteye.com/topic/834528

 

弱弱的问一下,正文中的[1],怎么弄成上角标捏?

 

分享到:
评论

相关推荐

    Struts2单元测试

    Struts2的单元测试支持使用Mockito等库来创建ActionContext的模拟对象,以便在无实际web容器的情况下运行测试。 2. **Interceptor测试**:拦截器是Struts2中强大的功能,可以在请求处理流程中插入自定义逻辑。测试...

    powermock-easymock-junit-1.5.4.zip

    PowerMock与EasyMock是Java单元测试领域中的两个重要库,它们与JUnit结合使用,能够帮助开发者在测试过程中模拟复杂的对象行为和系统环境。这个压缩包"powermock-easymock-junit-1.5.4.zip"很可能包含了这三个库的...

    powermock-easymock-junit-1.6.1.zip

    静态方法在很多情况下被广泛使用,但它们的不可变性使得它们在单元测试中成为一个挑战。PowerMock通过字节码操作技术(如ASM库)实现了对静态方法的模拟,从而使得测试覆盖更全面。 此外,PowerMock还支持对final类...

    easymock-2.5.2.jar

    easymock-2.5.2.jar easymock-2.5.2.jar 单元测试

    4-EasyMock-Servlet.rar

    在“4-EasyMock-Servlet.rar”这个压缩包中,我们很可能是得到了一个关于如何使用EasyMock进行Servlet测试的教程或者示例代码。让我们详细探讨一下EasyMock与Servlet结合使用的相关知识点。 1. **EasyMock基本概念*...

    转:EasyMock 单元测试

    EasyMock 是一个流行的 Java 单元测试框架,它帮助开发者创建模拟对象来测试目标类的行为。这篇文档将深入探讨 EasyMock 的使用方法和原理,以便更好地理解和应用这一工具。 首先,让我们理解 EasyMock 的核心概念...

    Junit+EasyMock单元测试使用资料以及案例分析

    Junit和EasyMock是Java领域中广泛使用的两个工具,它们协同工作,提供了强大的单元测试能力。本文将深入探讨这两个工具的使用,并通过案例分析帮助你更好地理解和应用它们。 **Junit简介** JUnit是Java编程语言中最...

    easymock-3.1.jar

    easymock需要用到的包,没有它不行,easymock-3.1.jar

    EasyMock单元测试例子

    通过"EasyMock单元测试例子"中的代码,我们可以深入学习如何设置和使用这些特性。每个示例都会包含创建、设置期望、验证和清理的步骤,这将帮助我们掌握EasyMock的实际应用。记住,有效的单元测试应该是独立的、可...

    easymock-3.2.jar

    EasyMock主要是为测试提供模拟数据,比如你可以模拟HttpServletRequest。

    easymock-4.0-bundle

    手动的构造 Mock 对象会给开发人员带来额外的编码量,而且这些为创建 Mock 对象而编写的代码很有可能引入错误。目前,有许多开源项目对动态...通过 EasyMock,我们可以方便的构造 Mock 对象从而使单元测试顺利进行。

    EasyMock 3.1相关jar(所有)

    还在为EasyMock使用时出异常而烦恼? 本压缩包包含除了Junit4之外easyMock3.1所用到的所有相关jar包,junit4可自己导入eclipse自带的即可 本压缩包包括: asm.jar cglib.jar objenesis.jar等 其中asm与cglib已兼容,放心...

    easymock-3.2.zip

    使用EasyMock进行单元测试的基本流程如下: 1. **创建模拟对象**:首先,你需要使用EasyMock的`createMock()`方法创建你要模拟的对象。这将返回一个空的模拟对象,你可以设置其行为。 2. **设置期望**:然后,你...

    easymock-2.5.2工具 下载

    在使用EasyMock时,开发者通常会结合其他单元测试框架,如JUnit或TestNG,编写测试用例。通过导入EasyMock库并创建模拟对象,然后设定其行为,最后执行测试并验证结果,整个测试流程就得以完成。 总的来说,...

    easymock-3.1

    EasyMock 3.1 是一个流行的Java模拟框架,它允许开发者在单元测试中模拟对象的行为,以便更好地控制测试环境并确保代码的正确性。在这个压缩包中,我们找到了相关的文档和jar包,这些都是理解并使用EasyMock 3.1的...

    easymock-4.2.jar

    EasyMock 是一套通过简单的方法对于指定的接口或类生成 Mock 对象的类库,它能利用对接口或类的模拟来辅助单元测试。 Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂...

    easymock-request.getParamsNames

    本文将详细讲解如何使用 Easymock 对 Servlet 进行单元测试,特别是针对 `HttpServletRequest` 中获取参数的方法 `getParamsNames()`。 在Servlet编程中,`HttpServletRequest` 是一个核心接口,它提供了处理HTTP...

    easymock.jar,easymockclassextension.jar

    使用Easymock进行单元测试时,你通常需要以下步骤: 1. **导入库**:在你的测试类中,你需要引入Easymock的相关库,包括`easymock.jar`和`easymockclassextension.jar`。 2. **创建模拟对象**:使用Easymock的`...

    rh-java-common-easymock2-javadoc-2.5.2-12.15.el7.noarch.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    easymock2-javadoc-2.5.2-12.el7.noarch.rpm

    离线安装包,亲测可用

Global site tag (gtag.js) - Google Analytics