`
watanoeye
  • 浏览: 19214 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
社区版块
存档分类
最新评论

使用表达式引擎测试bean的字段

阅读更多
今天做梦梦见和人讨论上个项目的技术实现,突然灵感来了,想到如何简化测试用例的书写.醒来后简单实现了一个,仅供大家参考. 我很懒,一般都不写注释,大家凑合着看看吧:(

概要:

Assert.assertEquals(1, testBean.get_int());
		Assert.assertEquals(true, testBean.is_bool());
		Assert.assertEquals(1.23, testBean.get_double(), 10);
		Assert.assertEquals(1.2f, testBean.get_float(), 10);
		Assert.assertEquals('c', testBean.get_char());
		Assert.assertEquals(1234l, testBean.get_long());
		Assert.assertEquals((byte) 0x01, testBean.get_byte());
		Assert.assertEquals("abc", testBean.get_string());

简化为:
ELAssert.assertTrue(
				testBean,
				"this._int==1 && this._bool==true && this._double==1.23 && this._string=='abc'");

或者
ELAssert.assertJsonFields(testBean,
		"_int:1,_bool:true,_double:1.23,_float:1.2,_long:1234,_string:'abc'");

或者
ELAssert.assertFieldMap(testBean,
				Lang.map("{_int:1,_bool:true,_double:1.23,_float:1.2,_long:1234,_string:'abc'}"));

或者
ELAssert.assertFields(testBean,
				"_int,_bool,_double,_float,_long,_string",
				1, true, 1.23, 1.2f, 1234l, "abc");


ELAssert.java 基本实现类
package com.watano.util.test;

import java.util.Map;

import junit.framework.Assert;

import org.apache.commons.lang.StringUtils;
import org.nutz.el.El;
import org.nutz.lang.Lang;
import org.nutz.lang.util.Context;

public class ELAssert {

	public static void assertTrue(Object actual, String expected) {
		Context context = Lang.context();
		context.set("this", actual);
		Boolean iactual = (Boolean) El.eval(context, expected);
		Assert.assertTrue("Expected: " + expected + " but was: " + iactual, iactual);
	}

	public static void assertJsonFields(Object actual, String expectedjson) {
		assertFieldMap(actual, Lang.map(expectedjson));
	}

	public static void assertFieldMap(Object actual, Map<String, Object> expected) {
		Context context = Lang.context();
		context.set("this", actual);
		for (String field : expected.keySet()) {
			Object iactual = El.eval(context, "this." + field);
			Object iexpected = expected.get(field);
			if (iactual instanceof Float || iactual instanceof Long) {
				iactual = iactual + "";
				iexpected = iexpected + "";
			}
			Assert.assertEquals("Field '" + field + "' Expected: " + iexpected + " but was: " + iactual,
					iexpected, iactual);
		}
	}

	public static void assertFields(Object actual, String fields, Object... expecteds) {
		Context context = Lang.context();
		context.set("this", actual);
		String[] arrFields = StringUtils.split(fields, ',');
		for (int i = 0; i < arrFields.length; i++) {
			String field = arrFields[i].trim();
			Object iactual = El.eval(context, "this." + field);
			Object iexpected = expecteds[i++];
			if (iexpected == null) {
				Assert.assertNull("Field '" + field + "' Expected: " + iexpected + " but was: " + iactual,
						iactual);
			} else {
				Assert.assertEquals("Field '" + field + "' Expected: " + iexpected + " but was: " + iactual,
						iexpected, iactual);
			}
		}
	}
}


TestBean.java 测试中使用到的bean
package com.watano.util.test;

public class TestBean {
	private int _int;
	private boolean _bool;
	private double _double;
	private float _float;
	private char _char;
	private long _long;
	private byte _byte;
	private String _string;

	public TestBean(int _int, boolean _bool, double _double, float _float, char _char, long _long, byte _byte,
			String _string) {
		super();
		this._int = _int;
		this._bool = _bool;
		this._double = _double;
		this._float = _float;
		this._char = _char;
		this._long = _long;
		this._byte = _byte;
		this._string = _string;
	}

	public int get_int() {
		return _int;
	}

	public void set_int(int _int) {
		this._int = _int;
	}

	public boolean is_bool() {
		return _bool;
	}

	public void set_bool(boolean _bool) {
		this._bool = _bool;
	}

	public double get_double() {
		return _double;
	}

	public void set_double(double _double) {
		this._double = _double;
	}

	public float get_float() {
		return _float;
	}

	public void set_float(float _float) {
		this._float = _float;
	}

	public char get_char() {
		return _char;
	}

	public void set_char(char _char) {
		this._char = _char;
	}

	public long get_long() {
		return _long;
	}

	public void set_long(long _long) {
		this._long = _long;
	}

	public byte get_byte() {
		return _byte;
	}

	public void set_byte(byte _byte) {
		this._byte = _byte;
	}

	public String get_string() {
		return _string;
	}

	public void set_string(String _string) {
		this._string = _string;
	}
}


ELAssertTest,java 简单的测试用例
package com.watano.util.test;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.nutz.el.El;
import org.nutz.lang.Lang;
import org.nutz.lang.util.Context;

public class ELAssertTest {
	private TestBean testBean;

	@Before
	public void setUp() throws Exception {
		// int _int, boolean _bool, double _double, float _float, char _char, long _long, byte _byte, String _string
		testBean = new TestBean(1, true, 1.23, 1.2f, 'c', 1234l, (byte) 0x01, "abc");
	}

	@Test
	public void testAssertTrue() {
		Context context = Lang.context();
		context.set("a", 1.2);
		Assert.assertTrue((Boolean) El.eval(context, "a==1.2"));
// context.set("a", 1.2f);
// Assert.assertTrue((Boolean) El.eval(context, "a==1.2"));
// context.set("a", 123l);
// Assert.assertTrue((Boolean) El.eval(context, "a==123"));

		ELAssert.assertTrue(
				testBean,
				"this._double==1.23");
// ELAssert.assertTrue(
// testBean,
// "this._float==1.2");
// ELAssert.assertTrue(
// testBean,
// "this._long==1234");
		ELAssert.assertTrue(
				testBean,
				"this._int==1 && this._bool==true && this._double==1.23 && this._string=='abc'");
	}

	@Test
	public void testAssertJsonFields() {
		ELAssert.assertJsonFields(testBean,
				"_int:1,_bool:true,_double:1.23,_float:1.2,_long:1234,_string:'abc'");
	}

	@Test
	public void testAssertFieldMap() {
		ELAssert.assertFieldMap(testBean,
				Lang.map("{_int:1,_bool:true,_double:1.23,_float:1.2,_long:1234,_string:'abc'}"));
	}

	@Test
	public void testAssertFields() {
		ELAssert.assertFields(testBean,
				"_int,_bool,_double,_float,_long,_string",
				1, true, 1.23, 1.2f, 1234l, "abc");
	}
}

已知问题:
1.此实现使用的是nutz的el实现,但是貌似这个实现对float和long的支持有点问题,注释部分不能通过,这个问题我已经到google code上提交了一个issue.
2.json不支持char,和byte,所以暂时没考虑这两种类型的处理
1
2
分享到:
评论
3 楼 di1984HIT 2013-08-26  
写的不错。呵呵
2 楼 watanoeye 2011-10-08  
其实这个东西很简单,只不过这个居然是我在梦中想到的完整实现方案,这就有点神奇了,不知道大家也有类似的经验吗?
1 楼 饶首建 2011-10-07  
这个还可以撒

相关推荐

    利用java反射校验struts中的form(含正则表达式)

    在struts框架中,如果每次都去校验form中的每个字段,显然费时费力,本例通过java反射得到form中的字段和值,并较验,用于在与数据库交互之前的校验,从而防止数据库恶意注入. 随包附带一个通用的易扩展的正则表达式校验类...

    Spring 3 Reference中文

    第一部分 Spring framework 概述..5 ... 4.10.4 使用组件定义bean 的元数据.. 99 4.10.5 命名自动检测组件 100 4.10.6 为自动检测组件提供范围. 101 4.10.7 使用注解提供限定符元数据. 102

    J2EE中文版指南 CHM格式 带全文检索

    在Bean管理事务中不允许使用的方法 222 四.企业Bean事务摘要 222 五.事务超时 222 六.隔离级别 223 七.更新多个数据库 223 八.Web 组件事务 225 第15章 安全 226 一.纵览 226 二.安全角色 227 声明和连接角色...

    Spring核心注解深入解析:提升开发效率

    @Autowired 注解用于自动注入依赖,它可以放置在字段、构造器、setter方法或其他任何方法上,Spring容器会自动寻找并注入正确的bean。 @Configuration 和 @Bean 注解用于Java配置,允许开发者用程序的方式定义Spring...

    Spring中文帮助文档

    11.5.3. 指定SimpleJdbcInsert所使用的字段 11.5.4. 使用SqlParameterSource提供参数值 11.5.5. 使用SimpleJdbcCall调用存储过程 11.5.6. 声明SimpleJdbcCall使用的参数 11.5.7. 如何定义SqlParameters 11.5.8....

    Spring API

    11.5.3. 指定SimpleJdbcInsert所使用的字段 11.5.4. 使用SqlParameterSource提供参数值 11.5.5. 使用SimpleJdbcCall调用存储过程 11.5.6. 声明SimpleJdbcCall使用的参数 11.5.7. 如何定义SqlParameters 11.5.8....

    bean-mapping

    语法支持:默认支持JDK8,lambda表达式,仅限使用JDK8+版本 对象对类自动映射:默认支持 source -&gt; class类的自动映射 对象对类手动映射:适配自动映射,支持不一致字段名称,不一致类型字手动映射。 集合对集合的自动...

    struts2讲义_吴峻申

    5.4.2 bean标签使用介绍 89 5.4.3 date标签使用介绍 91 5.4.4 debug标签使用介绍 94 5.4.5 include标签使用介绍 95 5.4.6 push标签使用介绍 97 5.4.7 set标签使用介绍 98 5.4.8 url标签使用介绍 99 5.4.9 param标签...

    Struts2 in action中文版

    5.3.2 使用OGNL表达式从表单字段名映射到属性 90 5.4 自定义类型转换 101 5.4.1 实现类型转换器 102 5.4.2 在String和Circle之间转换 102 5.4.3 配置框架使用自定义转换器 103 5.5 小结 106 第三部分 构建视图——...

    Spring攻略(第二版 中文高清版).part2

    2.3 从静态字段中声明Bean 60 2.3.1 问题 60 2.3.2 解决方案 60 2.3.3 工作原理 61 2.4 从对象属性中声明Bean 62 2.4.1 问题 62 2.4.2 解决方案 62 2.4.3 工作原理 62 2.5 使用Spring表达式语言 ...

    Spring攻略(第二版 中文高清版).part1

    2.3 从静态字段中声明Bean 60 2.3.1 问题 60 2.3.2 解决方案 60 2.3.3 工作原理 61 2.4 从对象属性中声明Bean 62 2.4.1 问题 62 2.4.2 解决方案 62 2.4.3 工作原理 62 2.5 使用Spring表达式语言 ...

    快学 scala 中文版 带完整目录

    16.5 在属性中使用表达式 264 16.6 特殊节点类型 265 16.7 类XPath表达式 266 16.8 模式匹配 267 16.9 修改元素和属性 268 16.10 XML变换 269 16.11 加载和保存 270 16.12 命名空间 273 练习 275 第17章 ...

    spring security 参考手册中文版

    12.2.3使用RequestPostProcessor在Spring MVC测试中以用户身份运行 106 作为用户在Spring MVC测试中使用注释运行 108 12.2.4测试HTTP基本认证 109 12.3 SecurityMockMvcRequestBuilders 109 12.3.1测试基于表单的...

    J2EE应用开发详解

    149 9.4 JSF的组成 152 9.4.1 UI组件 152 9.4.2 JSF标签 154 9.5 统一EL 156 9.5.1 表达式和函数 156 9.5.2 操作符 157 9.5.3 保留字 158 9.5.4 内置对象 158 9.6 Backing Bean 158 9.7 创建自定义组件 162 9.8 小结...

    Grails 中文参考手册

    6.2.2.5 表单和字段 6.2.2.6 标签作为方法调用 6.2.3 视图和模板 6.2.4 使用Sitemesh布局 6.3 标签库 6.3.1 简单标签 6.3.2 逻辑标签 6.3.3 迭代标签 6.3.4 标签命名空间 6.4 URL映射 6.4.1 映射到控制器和操作 ...

    ssh(structs,spring,hibernate)框架中的上传下载

     使用BlobByteArrayType字段类型后,为什么我们就可以象一般的字段类型一样操作Blob字段呢?可以确定的一点是:BlobByteArrayType不可能逾越Blob天生的操作方式,原来是BlobByteArrayType数据类型本身具体数据访问...

    phalidator:通用用户输入验证 libservice

    主意验证器是用一个简单的脚本编写的,它为模型的不同字段定义了验证表达式。 解析脚本并构建一棵树。 使用antlr4,这一步是用java实现的。 该树可用于直接验证实体(bean、地图等)。 不过,这将更多地用于测试。 ...

    J2EE面试题

    9) aa.jsp与bb.jsp属于同一应用,在aa.jsp中使用&lt;jsp:useBean id="beanName" scope="session" class="mypackage.mybean" /&gt;标记,在bb.jsp中要把beanName这个bean对象变量所引用的对象取出来。那么对于以下描述,...

    JSP动态网站开发基础教程与实验指导(从基础到应用)光盘

    练习6-3 使用日期字段查询数据 333 练习6-4 网上投票 334 第7单元 336 练习7-1 读文件Bean 336 练习7-2 数据库操作Bean 337 练习7-3 数据库分页Bean 340 第8单元 344 练习8-1 Servlet读取数据库记录 344 练习8-2 ...

Global site tag (gtag.js) - Google Analytics