今天做梦梦见和人讨论上个项目的技术实现,突然灵感来了,想到如何简化测试用例的书写.醒来后简单实现了一个,仅供大家参考. 我很懒,一般都不写注释,大家凑合着看看吧:(
概要:
把
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,所以暂时没考虑这两种类型的处理
分享到:
相关推荐
这段代码使用了Lambda表达式来构建查询条件,其中`User::getUsername`是Lambda语法,用于指定`username`字段。然而,问题可能出现在实体类`User`的定义上。 为了确保MyBatis-Plus能够正确地映射Java字段到数据库列...
例如,当使用`#{bean.property}`形式的表达式时,框架会尝试调用对应的getter方法来获取属性值。 #### 四、设置值语义 与获取值相似,当设置Bean的属性值时,JSF框架也会调用相应的setter方法。例如,在用户提交...
- 通过`parseExpression(String expression)`方法解析表达式,然后使用`getValue(Object rootObject, Map, Object> variables)`方法求值。 9. **安全性考虑** - 虽然SpEL强大,但允许运行时计算也可能带来安全...
- **使用EL表达式引用Bean**:通过`#{beanName.propertyName}`语法可以在JSF页面中引用Bean的属性。 - **数据绑定**:可以直接将表单字段与Bean的属性进行绑定,从而简化数据处理流程。 - **事件监听**:可以定义...
这个工具允许用户在浏览器环境中创建和测试Quartz表达式,无需记住复杂的语法,避免了手动编写表达式的困扰。 在使用这个生成器之前,你需要将压缩包中的文件解压,并将包含的jar包和html文件添加到你的项目中。...
首先,SpEL提供了一种简洁的方式来访问和操作Bean的属性,它允许我们在配置中使用表达式来设置Bean的属性值。例如,我们可以使用`#{T(java.lang.Math).random()}`来注入一个随机数,或者`#{systemProperties['java....
在实际开发中,可能会遇到更复杂的情况,例如Bean的属性是嵌套的、Map中的键与Bean属性名不完全匹配等,这时候需要进一步完善转换逻辑,可能需要递归处理或使用正则表达式进行匹配。 此外,Java标准库中提供了`org....
除了基本的注解,Bean Validation还提供了许多其他注解,如`@Pattern`用于正则表达式匹配,`@Min`和`@Max`用于数值范围,`@Past`和`@Future`用于日期和时间等。同时,开发者还可以自定义约束注解,通过实现`...
2. **变量和上下文**:SpEL可以访问应用程序上下文中的bean和属性,例如`#root`代表当前表达式上下文,`#this`表示正在被评估的对象。`#params`则提供对方法参数的访问。 3. **条件和逻辑运算**:SpEL支持if-else...
标题中的“ADF进页面前默认赋值(Groovy表达式)”指的是在Oracle Application Development Framework (ADF) 中,如何在页面加载之前使用Groovy表达式为字段设置默认值。ADF是一种Java EE框架,常用于构建企业级的应用...
在本实践项目“练习1:使用EL表达式实现一项问卷调查”中,我们将深入探讨Java Web开发中的一个重要组件——EL(Expression Language),它是JavaServer Pages(JSP)标准的一部分,用于简化网页和JavaBean之间的...
cron测试工具是IT行业中用于调试和验证cron表达式的实用程序,尤其在自动化任务调度中扮演着重要角色。cron是Unix/Linux系统中的一个时间计划任务工具,而在Java开发环境中,我们通常使用类似的定时任务框架,例如...
4. **自定义配置**:对于非Bean属性的复杂配置,可以使用`@Value`注解,注入环境变量、属性文件中的值,甚至SpEL表达式。 ```java @Value("${db.url}") private String dbUrl; ``` 5. **配置Bean作用域**:使用`@...
SpEL是Spring提供的强大表达式语言,用于在运行时查询和操作Bean的属性。 10. **Bean的自动扫描** 使用`@ComponentScan`注解可以自动发现并注册带有特定注解的类作为Bean。 11. ** Profiles** Spring支持配置多...
6. **XPath支持**:XMLBean支持XPath表达式,使得开发者可以通过简单的路径表达式来查询和提取XML文档中的特定数据,增强了对XML数据的操作能力。 7. **Namespace支持**:XMLBean完全支持XML命名空间,确保了处理带...
综上所述,《Bean Validation规范详解》不仅为开发者提供了全面的技术指南,也为Bean Validation的使用者和贡献者构建了一个坚实的知识基础,帮助他们在实际项目中更好地应用这一强大的验证框架。
EL是JavaServer Faces (JSF) 和其他Java技术中用于在视图层解析表达式并获取数据的工具,它允许在运行时评估Java表达式,例如获取Bean属性、方法调用等。在Spring AOP中,EL可以帮助我们访问被拦截方法的局部变量,...
`@Autowired`注解可以应用在字段、方法和构造函数上,Spring会根据类型或名称自动寻找匹配的Bean进行注入。 7. ** Profiles**: Spring支持配置多个环境下的Bean,如开发、测试和生产环境。通过`@Profile`注解,我们...
- 自Spring 2.5引入注解支持以来,我们可以通过在字段或setter方法上使用`@Autowired`注解来进行属性注入。 ```java @Component public class ExampleClass { @Autowired private AnotherBean myObject; @...
开发者可以根据数据库中的表结构自动生成对应的Java Bean类,每个字段对应表的一列。这可以通过解析数据库的元数据完成,例如获取表的字段名、类型等信息,然后生成相应的属性和getter/setter方法。 4. **支持MySQL...