- 背景
在编写单元测试,经常遇到需要创建实体对象的场景,比如测试插入实体到数据库的场景。针对这些状况,我们一般做法是先new一个空的实体对象,然后通过调用属性的set方法完成赋值动作。当实体属性只有少量几个的时候,手工调用set方法可能不会成为问题,但当实体对象的属性达到10个或者更多时,逐个调用set方法效率非常低,而且频繁重复工作让人容易烦劳疲惫,不利于工作的快速开展。
目前css项目中使用到单元测试辅助工具springdbtest,经常需要构建xml预期结果文件,当表中字段非常多时,手工构建xml文件存在容易出错,效率低等问题。
基于上述问题,这里将通过工具的方式,自动完成实体对象及xml内容的构建工作,减少单元测试编写中的工作量,提升效率。 - 目的
通过java反射技术,快速构建随机的实体对象及xml内容,简化工作,提升效率。 - 总括
创建实体对象及xml内容生成等功能是由 工具类 TestHelper 提供。
TestHelper工具类下载:TestHelper.java
TestAssertHelper 工具类支持对实体对象的断言,避免手工对实体对象的每个属性进行断言比较。
test-helper项目包含该工具类及相关的单元测试用例,下载地址为:test-helper.rar
下面简单介绍类中的方法:- 创建实体对象
-
public static <T> T newInstance(Class<T> clazz, String[] ignoreFields, OverrideFieldMap<String, Object> overrideFieldMap, boolean isIgnoreSuperClassField)
- public static <T> T newInstance(Class<T> clazz, String[] ignoreFields, OverrideFieldMap<String, Object> overrideFields) (isIgnoreSuperClassField =false)
- 参数介绍:
clazz 需要创建的类型
ignoreFields 需要忽略设置取值的属性名称列表,该参数中的取值为实体属性的名称,处于该字段名数组中的属性将不会自动生成随机值
使用场景:
1. 对于那些不需要赋值的字段进行过滤;
2. 该工具方法默认不支持属性为实体对象的,可以通过该参数进行过滤overrideFieldMap 需要重载的属性map, key为实体属性名称;value为该属性的取值;
使用场景:
1. 因为有可能随机生成的属性取值不满足需求,可以使用该参数对属性取值进行指定;
2. 该工具方法为字段生成随机值时,遇到不支持的属性类型时,将抛出异常;如果想继续使用该工具方法,可以使用该参数,进行人为指定不支持的类型属性的取值
isIgnoreSuperClassField是否需要为父类中的属性进行赋值;true表示忽略父类中的字段;false表示需要为父类中的字段进行赋值
-
- 将实体对象转换为xml
- public static String toDbTestXml(Object entity, String[] ignoreFields, boolean isIgnoreSuperClassField)
- public static String toDbTestXml(Object entity, String[] ignoreFields) (isIgnoreSuperClassField = false)
- 参数介绍:
entity 实体对象
ignoreFields 不需要再输出的xml中出现的属性列表,可以是当前类及父类中的属性名称
isIgnoreSuperClassField 是否 忽略父类中的属性,true表示忽略,在输出的xml中不会存在父类属性; false 不忽略,xml中将会输出父类中的属性
- 创建实体对象
- 使用
- 使用流程
- 添加工具类中有依赖fastjson包
- 将工具下载复制到自己工程的单元测试所在包中,将工具类所在包名更改为自有包名即可
- 使用案例
场景:测试man表的插入方法是否正确
步骤:
1、调用创建实体方法, 如Man man = TestHelper.newInstance(Man.class, null, null);
2、创建实体方法会打印下属结果:
如下图所示:
结果由2部分构成:
第1部分为 实体对应xml内容,直接复制到springdbtest 的xml文件中即可,为预期的xml结果;
第2部分为 代码部分,包括json字符串及json反序列化语句,该语句直接复制到单元测试的方法中即可。
3、将结果中的第1部分内容直接复制到springdbtest 的xml文件中即可,为预期的xml结果;
4、将结果中的第2部分内容该语句直接复制到单元测试的方法中即可。
5、单元测试完成;
场景:测试属性过滤功能
步骤:
1、Man man = TestHelper.newInstance(Man.class, new String[]{"sex", "name", "tid"}, null, false);
2、打印的结果中,过滤参数数组中存在的字段取值为null或者默认值;
场景:测试属性取值重载功能;
步骤:
1、Man man = TestHelper.newInstance(Man.class, null, TestHelper.overrideFieldMap().put("sex", -1).put("name", "bob").put("tid", 1000), false);
2、打印的结果中,实体属性sex=-1, name="bob", tid=1000- 更多使用方式及测试用例可以查看附件test-help项目单元测试TestHelperTest.java
场景:将数据库中的记录转换为springdbtest中的xml内容(需要自己从数据库查询数据记录)
- 使用流程