`
garyli
  • 浏览: 175826 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

junit4参数化测试和easymock的使用

    博客分类:
  • java
阅读更多
利用junit4的一些新特性,我们可以方便的对多个参数进行测试,下面举一个计算数值和的例子:
package com.test.junit4;

import java.util.Arrays;  
import java.util.Collection;  
  
import org.junit.Assert;  
import org.junit.Test;  
import org.junit.runner.RunWith;  
import org.junit.runners.Parameterized;  
import org.junit.runners.Parameterized.Parameters;  
/** 
 * 参数化测试的类必须有Parameterized测试运行器修饰 
 * 
 */  
@RunWith(Parameterized.class)  
public class AddTest3 {  
  
    private int input1;  
    private int input2;  
    private int expected;  
      
    /** 
     * 准备数据。数据的准备需要在一个方法中进行,该方法需要满足一定的要求: 
 
         1)该方法必须由Parameters注解修饰 
         2)该方法必须为public static的 
         3)该方法必须返回Collection类型 
         4)该方法的名字不做要求 
         5)该方法没有参数 
     * @return 
     */
    @Parameters  
    @SuppressWarnings("unchecked")  
    public static Collection prepareData(){  
        Object [][] object = {{-1,-2,-3},{0,2,2},{-1,1,0},{1,2,3}};  
        return Arrays.asList(object);
    }  
    
    public AddTest3(int input1,int input2,int expected){  
        this.input1 = input1;  
        this.input2 = input2;  
        this.expected = expected;  
    }  
    @Test  
    public void testAdd(){  
        Add add = new Add();  
        int result = add.add(input1, input2);  
        Assert.assertEquals(expected,result);  
    }  
    
    class Add{
    	public int add(int a,int b){  
    		return a+b;  
    	}  
    }
}
 
结合junit4和easymock,我自己为我的代码写了一个测试类:
 我的原程序是一个从HttpServletRequest获得参数,计算结果后用socke发送一个请求然后再接受一个请求,代码如下:
package com.movellsoft.ideal.manufacturer.diagnostics.web;

import java.io.File;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.apache.struts2.interceptor.ServletRequestAware;

import com.movellsoft.ideal.core.web.Struts2Action;
import com.movellsoft.ideal.manufacturer.diagnostics.socket.ClientTCPSocket;


@SuppressWarnings("serial")
public class DiagnosticsRemoteAction extends Struts2Action implements ServletRequestAware{
	
	private static Logger log = Logger.getLogger(DiagnosticsRemoteAction.class);
	private HttpServletRequest request;
	private ClientTCPSocket socket;
	
	public void setSocket(ClientTCPSocket socket) {
		this.socket = socket;
	}

	public String remoteDiag(){
		log.debug("<<< reomoteDiag <<< ");
		String conn 		= request.getParameter("connect");
		String connValue 	= request.getParameter("ConnectValue");
		String dtype 		= request.getParameter("data_type");
		String display 		= request.getParameter("display");
		String rtime 		= request.getParameter("realtime");
		String proname 		= request.getParameter("process_name");
		String allsr		= request.getParameter("all_stacks_regs");
		boolean flag400 = allsr.equals("1");
//		System.out.println("---------------------------all stack & register :: "+ allsr);
		//String modulename = request.getParameter("module_name");
		
		if(conn == null || "".equals(conn)){
			request.setAttribute("msg", getText("connect.notnull"));
			log.debug("conn");
			return SUCCESS;
		}
		if(!conn.equals("cable") && (connValue == null || "".equals(connValue))){
			request.setAttribute("msg", getText("convalue.notnull"));
			log.debug("connValue");
			return SUCCESS;
		}
		if(dtype == null || "".equals(dtype)){
			request.setAttribute("msg", getText("dtype.notnull"));
			log.debug("dtype");
			return SUCCESS;
		}
		log.debug("check filed over");
		
		//拼装byte数组
		
		//16个01
		byte[] bts = new byte[128];
		for (int i = 0; i < 16; i++) {
			bts[i] = 1;
		}
		
		//02,D0,01
		bts[16] = 2;
		bts[17] = -48;
		for (int j = 18; j < 22 ; j++) {
			bts[j] = 0;
		}
		bts[22] = 1;
		InetAddress addr = null;
		try {
			addr = InetAddress.getLocalHost();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		String ip = addr.getHostAddress();
		
		if(conn.equals("ip")){
			ip = connValue;
		}
		log.debug("<<< ip == "+ip);
		
		//ip length
		bts[23] = (byte)ip.length();
		byte[] btip = ip.getBytes();
		int length = btip.length;
		int j = 24;
		
		//ip
		for (int i = 0 ; i < length; i++,j++) {
			bts[j] = btip[i]; 
		}
		//////////////////////改变下面的顺序
		
		
		//sender SMS 0,cable 1[4]
		for(int i=0;i<3;i++){
			bts[j++]=0;
		}
		if(conn.equals("ip")){
			log.debug("ip");
			bts[j++]=0;
		}
		else if(conn.equals("cable")){
			bts[j++]=1;
		}
		//operation [4]
		log.debug("dtype=["+dtype+"]");
		if(dtype.equals("lastreport")){
			bts[j++]=0;
			bts[j++]=0;
			bts[j++]=0;
			bts[j++]=2;
		}
		else if(dtype.equals("allreport")){
			bts[j++]=0;
			bts[j++]=0;
			bts[j++]=0;
			bts[j++]=1;
		}
		else if(dtype.equals("realtime")){
			if(rtime.equals("sysdata")){
				if(flag400){
					bts[j++]=0;
					bts[j++]=4;
					bts[j++]=0;
					bts[j++]=0;
				}
				else{
					bts[j++]=0;
					bts[j++]=0;
					bts[j++]=0;
					bts[j++]=0;
				}
			}
			else if(rtime.equals("f")){
				bts[j++]=2;
				bts[j++]=0;
				bts[j++]=0;
				bts[j++]=0;
			}
			else if(rtime.equals("m")){
				if(flag400){
					bts[j++]=4;
					bts[j++]=4;
					bts[j++]=0;
					bts[j++]=0;
				}else{
					bts[j++]=4;
					bts[j++]=0;
					bts[j++]=0;
					bts[j++]=0;
				}
			}
			else if(rtime.equals("mandf")){
				bts[j++]=6;
				bts[j++]=0;
				bts[j++]=0;
				bts[j++]=0;
			}
			/***********************[ new ]******************************/
			else if(rtime.equals("oneProcess")){
				if(flag400){
					bts[j++]=(byte)128;
					bts[j++]=4;
					bts[j++]=0;
					bts[j++]=0;
				}else{
					bts[j++]=(byte)128;
					bts[j++]=0;
					bts[j++]=0;
					bts[j++]=0;
				}
			}
			else if(rtime.equals("oneModule")){
				if(flag400){
					bts[j++]=0;
					bts[j++]=6;
					bts[j++]=0;
					bts[j++]=0;
				}else{
					bts[j++]=0;
					bts[j++]=2;
					bts[j++]=0;
					bts[j++]=0;
				}
			}
			else if(rtime.equals("all_history")){
				if(flag400){
					bts[j++]=0;
					bts[j++]=5;
					bts[j++]=0;
					bts[j++]=0;
				}else{
					bts[j++]=0;
					bts[j++]=1;
					bts[j++]=0;
					bts[j++]=0;
				}
			}
			else if(rtime.equals("all_stacks_regs")){
				bts[j++]=0;
				bts[j++]=4;
				bts[j++]=0;
				bts[j++]=0;
			}
			/***********************[ new ]******************************/
		}
		
		//display 0 popup,1 nopopup[4]
		
		if(display.equals("nopopup")){
			log.debug("nopopup");
			bts[j++]=0;
			bts[j++]=0;
			bts[j++]=0;
			bts[j++]=0;
		}
		else if(display.equals("popup")){
			bts[j++]=0;
			bts[j++]=0;
			bts[j++]=0;
			bts[j++]=1;
		}
		
		//processname or module name length [4]
		if(proname != null && !"".equals(proname)){
			bts[j++]=(byte)proname.length();
			bts[j++]=0;
			bts[j++]=0;
			bts[j++]=0;
			//processname or module name
			byte[] pn = proname.getBytes();
			for(int i=0;i<pn.length;i++){
				bts[j++]=pn[i];
			}
		}
		byte[] bts2 = new byte[j++];
		for (int i = 0; i < bts2.length; i++) {
			bts2[i] = bts[i];
		}

		log.debug("bts2 length is "+bts2.length+" :");
		String d="";
		for(int i=0;i<bts2.length;i++){
			if(i%16==0)d+="\n";
			int v = bts2[i] & 0xFF;
			if (v < 16) d += "0";
			d += Integer.toString(v, 16).toUpperCase() + " ";
		}
				log.debug("<<<d : "+d);
				System.out.println(d);
		//打开socket 
		if(!socket.open(ip,"6789")){
			request.setAttribute("msg", getText("socket.error"));
			log.debug("<<<< msg:"+request.getAttribute("msg"));
			return SUCCESS;
		}
		//发送request
		if(socket.send(bts2) == -2){
			request.setAttribute("msg", getText("socket.error"));
			log.debug("<<<< msg:"+request.getAttribute("msg"));
			return SUCCESS;
		}
		socket.close();
		request.setAttribute("msg", getText("request.succeed"));
		log.debug("<<<< msg:"+request.getAttribute("msg"));
		return SUCCESS;
	}
	
	public String localDiag(){
		log.debug("<<< localDiag <<<");
		String serverpath = request.getParameter("serverpath");
		File serverf = new File(serverpath);
		if(serverf.exists()){
			
		}else{
			request.setAttribute("msg", getText("file.notexist"));
		}
		return SUCCESS;
	}
	
	
	public String remotepage(){
		return SUCCESS;
	}
	
	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}
	
	public static void main(String[] args) {
		byte[] bts2 = new byte[16];

		ByteBuffer bytebuf = ByteBuffer.wrap(bts2);
		bytebuf = bytebuf.order(ByteOrder.LITTLE_ENDIAN);
		bytebuf.putInt(12);
		bytebuf.putInt(15);
		bytebuf.putChar('a');
		bytebuf.putChar('b');
		bytebuf.put((byte)1);
		bytebuf.put((byte)2);
		bts2 = bytebuf.array();
		for (int i = 0; i < bts2.length; i++) {
			byte b = bts2[i];
			System.out.print(String.valueOf(b)+"\n");
		}
	}
}
 利用easymock和参数化测试,我写的一个测试类:
package com.movellsoft.ideal.manufacturer.diagnostics.web;

import java.lang.reflect.Method;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Collection;

import javax.servlet.http.HttpServletRequest;

import org.easymock.EasyMock;
import org.easymock.IMocksControl;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

import com.movellsoft.ideal.manufacturer.diagnostics.socket.ClientTCPSocket;

import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.anyObject;
import static org.easymock.classextension.EasyMock.createMock;
import static org.easymock.classextension.EasyMock.replay;
import static org.easymock.classextension.EasyMock.verify;

@RunWith(Parameterized.class)
public class TestRemoteAction {
	
	private IMocksControl control = EasyMock.createControl();
	private HttpServletRequest request = control.createMock(HttpServletRequest.class);
	private DiagnosticsRemoteAction rAction = new DiagnosticsRemoteAction();
	private ClientTCPSocket socket = null;
	
	private String realtime;
	private String all_st_reg;
	
	
	public TestRemoteAction(String realtime,String all_st_reg) {
		System.out.println(realtime+ " " +all_st_reg);
		this.realtime = realtime;
		this.all_st_reg = all_st_reg;
	}
	
	@SuppressWarnings("unchecked")
	@Parameters
	public static Collection prepareData(){
		Object [][] obs = {
			{"sysdata","0"},
			{"sysdata","1"},
			{"m","0"},
			{"m","1"},
			{"oneModule","0"},
			{"oneModule","1"},
			{"oneProcess","0"},
			{"oneProcess","1"},
			{"all_history","0"},
			{"all_history","1"},
			{"all_stacks_regs","0"},
			{"all_stacks_regs","1"}
		};
		return Arrays.asList(obs);
	}
	
	@Test
	public void exec(){
		request.getParameter("connect");
		expectLastCall().andReturn("cable");
		request.getParameter("ConnectValue");  
		expectLastCall().andReturn("");
		request.getParameter("data_type");
		expectLastCall().andReturn("realtime");
		request.getParameter("display");
		expectLastCall().andReturn("nopopup");
		request.getParameter("realtime");
		expectLastCall().andReturn(realtime);
		
		request.getParameter("process_name");
		expectLastCall().andReturn("");
		request.getParameter("all_stacks_regs");
		expectLastCall().andReturn(all_st_reg);
		
		try {
			socket = createMock(ClientTCPSocket.class,new Method[]{
				ClientTCPSocket.class.getMethod("open",String.class,String.class),
				ClientTCPSocket.class.getMethod("send", byte[].class)
			});
		} catch (SecurityException e1) {
			e1.printStackTrace();
		} catch (NoSuchMethodException e1) {
			e1.printStackTrace();
		}
		
		InetAddress addr = null;
		try {
			addr = InetAddress.getLocalHost();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		String ip = addr.getHostAddress();
		
		expect(socket.open(ip,"6789")).andReturn(true);
		
		expect(socket.send((byte[])anyObject())).andReturn(1);
		
		socket.close();
		
		request.setAttribute("msg", rAction.getText("request.succeed"));
		request.getAttribute("msg");
		expectLastCall().andReturn("");
		
		replay(socket);
		control.replay();
		/**********************/

		rAction.setServletRequest(request);
		rAction.setSocket(socket);
		rAction.remoteDiag();
		
		/***********************/
		control.verify();
		verify(socket);
	}
	
	@After
	public void line(){
		if("1".equals(all_st_reg))
		System.out.println("--------------------------------------------------------");
	}

}
 
以junit运行输出如下:

sysdata 0

01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
02 D0 00 00 00 00 01 0C 31 39 32 2E 31 36 38 2E
30 2E 31 37 00 00 00 01 00 00 00 00 00 00 00 00
sysdata 1

01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
02 D0 00 00 00 00 01 0C 31 39 32 2E 31 36 38 2E
30 2E 31 37 00 00 00 01 00 04 00 00 00 00 00 00
--------------------------------------------------------
m 0

01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
02 D0 00 00 00 00 01 0C 31 39 32 2E 31 36 38 2E
30 2E 31 37 00 00 00 01 04 00 00 00 00 00 00 00
m 1

01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
02 D0 00 00 00 00 01 0C 31 39 32 2E 31 36 38 2E
30 2E 31 37 00 00 00 01 04 04 00 00 00 00 00 00
--------------------------------------------------------
oneModule 0

01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
02 D0 00 00 00 00 01 0C 31 39 32 2E 31 36 38 2E
30 2E 31 37 00 00 00 01 00 02 00 00 00 00 00 00
oneModule 1

01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
02 D0 00 00 00 00 01 0C 31 39 32 2E 31 36 38 2E
30 2E 31 37 00 00 00 01 00 06 00 00 00 00 00 00
--------------------------------------------------------
oneProcess 0

01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
02 D0 00 00 00 00 01 0C 31 39 32 2E 31 36 38 2E
30 2E 31 37 00 00 00 01 80 00 00 00 00 00 00 00
oneProcess 1

01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
02 D0 00 00 00 00 01 0C 31 39 32 2E 31 36 38 2E
30 2E 31 37 00 00 00 01 80 04 00 00 00 00 00 00
--------------------------------------------------------
all_history 0

01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
02 D0 00 00 00 00 01 0C 31 39 32 2E 31 36 38 2E
30 2E 31 37 00 00 00 01 00 01 00 00 00 00 00 00
all_history 1

01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
02 D0 00 00 00 00 01 0C 31 39 32 2E 31 36 38 2E
30 2E 31 37 00 00 00 01 00 05 00 00 00 00 00 00
--------------------------------------------------------

junit显示结果:
分享到:
评论

相关推荐

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

    Junit支持注解、异常断言、测试套件和参数化测试等功能,使得编写和维护测试代码变得方便快捷。例如,`@Test`注解标记测试方法,`assertEquals()`用于验证预期结果与实际结果是否相符。 **EasyMock介绍** EasyMock...

    Junit+EasyMock单元测试的jar包

    Junit支持参数化测试、异常测试、定时测试等,大大提高了测试的灵活性和覆盖率。在Junit中,可以使用setUp()和tearDown()方法设置测试前后的环境,或者使用@Before和@After注解来实现相同的功能。 EasyMock则是一个...

    junit4.4.jar +easymock3.0.jar

    将这两个库结合使用,开发者可以在进行单元测试时,利用JUnit来组织和执行测试,而使用EasyMock来模拟复杂的依赖关系,使得测试更加独立和可控。通过这种方法,开发者可以专注于测试单个方法或组件,而不必担心外部...

    junit4 jar包

    JUnit4还支持测试套件(`@RunWith(Suite.class)`)、参数化测试(`@Parameters`)、定时器(`@Test(timeout = XXX)`)和假设(`Assume`类)等高级特性,这些都极大地增强了测试的灵活性和覆盖率。此外,JUnit4可以与...

    JUnit and EasyMock

    除了核心功能外,JUnit和EasyMock还提供了一系列高级特性和技巧,如参数化测试、超时测试、异常测试等,帮助开发者构建更强大、更复杂的测试场景。同时,掌握最佳实践和常见陷阱对于高效利用这些工具至关重要。 ...

    easymock selenium junit

    JUnit还支持参数化测试、套件测试和分类测试,使得测试更加灵活和全面。JUnit5引入了更多的改进,如条件测试、可中断测试、并行测试执行等,进一步提升了测试的效率和实用性。 将这三个工具结合使用,可以创建出...

    powermock-easymock-junit-1.6.1.zip

    在Java单元测试中,PowerMock和EasyMock是两个强大的库,它们扩展了JUnit的功能,使得开发者可以测试那些通常难以或无法直接测试的代码。PowerMock是基于EasyMock的一个扩展,它允许模拟静态方法、构造函数、final类...

    easymock测试servlet

    Mocking在软件开发中是一种非常重要的测试技术,它允许开发者模拟复杂的系统组件,如外部服务、数据库连接或在本例中的Servlet,以便于隔离和测试单个代码单元。Easymock是一个流行的Java库,它提供了创建和管理模拟...

    EasyMock

    在工具方面,EasyMock提供了方便的API和集成到各种测试框架(如JUnit)的能力,使得开发者可以轻松地在测试代码中使用模拟对象。此外,EasyMock还支持扩展,比如通过EasyMock Class Extension来模拟静态方法和最终类...

    PowerMock+Mockito-junit测试套件1.6.3版本

    在本文中,我们将深入探讨"PowerMock+Mockito-junit测试套件1.6.3版本"中的关键概念、功能和使用方法。 **PowerMock** PowerMock是一个扩展了其他Mocking框架(如EasyMock和Mockito)的库,它允许开发者对静态方法...

    JUnit JUnit

    6. **参数化测试**:使用`@Parameters`和`@Parameterized`注解,可以创建参数化的测试用例。 7. **测试超时**:`@Test(timeout =毫秒数)`可以设置测试方法的最长运行时间,超过这个时间则视为失败。 8. **注解驱动...

    junit4.3.1

    - **参数化测试**:允许通过`@Parameters`注解提供参数集,实现同一测试方法的不同输入和预期结果,增强了测试覆盖率。 - **异常测试**:可以使用`@Test(expected = Exception.class)`来检查方法是否抛出了预期的...

    junit

    3. **参数化测试(Parameterized Tests)**:JUnit 4支持参数化测试,允许你用不同的参数集运行同一个测试方法,这对于数据驱动测试非常有用。 4. **测试套件(Test Suites)**:通过`@Suite`注解,可以将多个测试...

    JUnit In Action的源代码

    JUnit是Java开发者进行单元测试的重要工具,它的使用和理解对于提升软件质量、保证代码可靠性至关重要。下面将详细阐述JUnit的核心概念、功能以及如何结合这本书的源代码进行学习。 JUnit是一个开源的测试框架,它...

    easyMock.zip

    当我们使用EasyMock创建的模拟对象时,可以在Junit的测试方法中调用它们,然后用断言检查这些模拟对象的行为是否符合预期。 此外,EasyMock还有扩展,如EasyMock Class Extension,它可以自动管理模拟对象的生命...

    Junit-3.8.1 src

    尽管JUnit 3.8.1已经比较老旧,但它仍然是理解测试基础和测试驱动开发的一个良好起点。如果你在分析源码,可以关注如何组织测试结构,如何处理测试生命周期,以及如何扩展和定制测试框架等方面。

    junit实战第二版

    6. **参数化测试**:JUnit 4引入了参数化测试,允许用不同的参数多次执行同一测试。`@Parameters`注解用于提供参数集合,`@Parameterized.Parameters`中的方法返回值即为参数列表。 7. **测试超时**:`@Test(time...

    EasyMock and PowerMock入门PPT

    除了EasyMock和JUnit,还需要PowerMock的核心库和相关的类加载器,如`powermock-api-easymock`、`powermock-module-junit4`等。 **PowerMock的扩展功能** - 模拟静态方法和类。 - 模拟final类和方法。 - 删除静态...

    Manning.-.JUnit.in.Action.2nd.Edition_英文版PDF

    本书第二版针对JUnit 4进行了全面更新,涵盖了新版本的特性,如参数化测试、假设测试、异常测试等,同时讨论了如何与其他工具和框架(如Mockito、EasyMock等)集成,以实现更复杂的测试场景。 本书首先介绍了单元...

Global site tag (gtag.js) - Google Analytics