`
watanoeye
  • 浏览: 19397 次
  • 性别: 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  
这个还可以撒

相关推荐

    解决mybatis-plus3.1.1版本使用lambda表达式查询报错的方法

    这段代码使用了Lambda表达式来构建查询条件,其中`User::getUsername`是Lambda语法,用于指定`username`字段。然而,问题可能出现在实体类`User`的定义上。 为了确保MyBatis-Plus能够正确地映射Java字段到数据库列...

    JavaServer Faces 表达式语言.doc

    例如,当使用`#{bean.property}`形式的表达式时,框架会尝试调用对应的getter方法来获取属性值。 #### 四、设置值语义 与获取值相似,当设置Bean的属性值时,JSF框架也会调用相应的setter方法。例如,在用户提交...

    spring spEL 表达式详解

    - 通过`parseExpression(String expression)`方法解析表达式,然后使用`getValue(Object rootObject, Map, Object&gt; variables)`方法求值。 9. **安全性考虑** - 虽然SpEL强大,但允许运行时计算也可能带来安全...

    JSF 资源 managed bean 课件

    - **使用EL表达式引用Bean**:通过`#{beanName.propertyName}`语法可以在JSF页面中引用Bean的属性。 - **数据绑定**:可以直接将表单字段与Bean的属性进行绑定,从而简化数据处理流程。 - **事件监听**:可以定义...

    spring quartz 表达式生成器 网页版

    这个工具允许用户在浏览器环境中创建和测试Quartz表达式,无需记住复杂的语法,避免了手动编写表达式的困扰。 在使用这个生成器之前,你需要将压缩包中的文件解压,并将包含的jar包和html文件添加到你的项目中。...

    day38 13-Spring的Bean的属性的注入:SpEL注入

    首先,SpEL提供了一种简洁的方式来访问和操作Bean的属性,它允许我们在配置中使用表达式来设置Bean的属性值。例如,我们可以使用`#{T(java.lang.Math).random()}`来注入一个随机数,或者`#{systemProperties['java....

    java Map转换成bean,利用java反射以及java和bean包

    在实际开发中,可能会遇到更复杂的情况,例如Bean的属性是嵌套的、Map中的键与Bean属性名不完全匹配等,这时候需要进一步完善转换逻辑,可能需要递归处理或使用正则表达式进行匹配。 此外,Java标准库中提供了`org....

    Bean Validation示例代码

    除了基本的注解,Bean Validation还提供了许多其他注解,如`@Pattern`用于正则表达式匹配,`@Min`和`@Max`用于数值范围,`@Past`和`@Future`用于日期和时间等。同时,开发者还可以自定义约束注解,通过实现`...

    spring3.0.2api 文档spring表达式语言

    2. **变量和上下文**:SpEL可以访问应用程序上下文中的bean和属性,例如`#root`代表当前表达式上下文,`#this`表示正在被评估的对象。`#params`则提供对方法参数的访问。 3. **条件和逻辑运算**:SpEL支持if-else...

    ADF进页面前默认赋值(Groovy表达式)

    标题中的“ADF进页面前默认赋值(Groovy表达式)”指的是在Oracle Application Development Framework (ADF) 中,如何在页面加载之前使用Groovy表达式为字段设置默认值。ADF是一种Java EE框架,常用于构建企业级的应用...

    练习1:使用EL表达式实现一项问卷调查.zip

    在本实践项目“练习1:使用EL表达式实现一项问卷调查”中,我们将深入探讨Java Web开发中的一个重要组件——EL(Expression Language),它是JavaServer Pages(JSP)标准的一部分,用于简化网页和JavaBean之间的...

    cron测试工具

    cron测试工具是IT行业中用于调试和验证cron表达式的实用程序,尤其在自动化任务调度中扮演着重要角色。cron是Unix/Linux系统中的一个时间计划任务工具,而在Java开发环境中,我们通常使用类似的定时任务框架,例如...

    day38 16-Spring的Bean的装配:注解的方式

    4. **自定义配置**:对于非Bean属性的复杂配置,可以使用`@Value`注解,注入环境变量、属性文件中的值,甚至SpEL表达式。 ```java @Value("${db.url}") private String dbUrl; ``` 5. **配置Bean作用域**:使用`@...

    spring管理bean应用实例代码

    SpEL是Spring提供的强大表达式语言,用于在运行时查询和操作Bean的属性。 10. **Bean的自动扫描** 使用`@ComponentScan`注解可以自动发现并注册带有特定注解的类作为Bean。 11. ** Profiles** Spring支持配置多...

    xmlbean API

    6. **XPath支持**:XMLBean支持XPath表达式,使得开发者可以通过简单的路径表达式来查询和提取XML文档中的特定数据,增强了对XML数据的操作能力。 7. **Namespace支持**:XMLBean完全支持XML命名空间,确保了处理带...

    Bean Validation 规范文档

    综上所述,《Bean Validation规范详解》不仅为开发者提供了全面的技术指南,也为Bean Validation的使用者和贡献者构建了一个坚实的知识基础,帮助他们在实际项目中更好地应用这一强大的验证框架。

    在自定义spring aop中使用el获取拦截方法的变量值。

    EL是JavaServer Faces (JSF) 和其他Java技术中用于在视图层解析表达式并获取数据的工具,它允许在运行时评估Java表达式,例如获取Bean属性、方法调用等。在Spring AOP中,EL可以帮助我们访问被拦截方法的局部变量,...

    spring 中特殊bean用法

    `@Autowired`注解可以应用在字段、方法和构造函数上,Spring会根据类型或名称自动寻找匹配的Bean进行注入。 7. ** Profiles**: Spring支持配置多个环境下的Bean,如开发、测试和生产环境。通过`@Profile`注解,我们...

    day38 11-Spring的Bean的属性的注入:对象属性

    - 自Spring 2.5引入注解支持以来,我们可以通过在字段或setter方法上使用`@Autowired`注解来进行属性注入。 ```java @Component public class ExampleClass { @Autowired private AnotherBean myObject; @...

    模拟hibernate根据表生成Java bean文件

    开发者可以根据数据库中的表结构自动生成对应的Java Bean类,每个字段对应表的一列。这可以通过解析数据库的元数据完成,例如获取表的字段名、类型等信息,然后生成相应的属性和getter/setter方法。 4. **支持MySQL...

Global site tag (gtag.js) - Google Analytics