在junit单元测试中,经常需要对一些领域模型的属性赋值,以便传递给业务类测试,常见的场景如下:
com.enation.javashop.goods goods = new com.enation.javashop.goods(); goods.setbrandid(1); goods.setcategoryid(1); goods.setgoodsname("测试商品"); goods.setprice(1.01); goods.setsn("100001"); goods.setweight(1.01);
如果领域模型的属性特别多,手工去写set方法令人发指,写了一个生成的工具类,用法如下:
string mockcode = mockdatagenerator.create(goods.class);
生成结果:
com.enation.javashop.goods goods = new com.enation.javashop.goods(); goods.setbrandid(819); goods.setcategoryid(109); goods.setcost(1.01); goods.setgoodsid(970); goods.setgoodsname("random_str748"); goods.setgoodstransfeecharge(164); goods.sethavespec(506); goods.setintro("random_str344"); goods.setmarketenable(878); goods.setmktprice(1.01); goods.setprice(1.01); goods.setsn("random_str316"); goods.setweight(1.01);
工具类代码:
package com.enation.app.javashop.saas; import com.enation.app.javashop.framework.util.stringutil; import org.springframework.beans.beanutils; import java.beans.propertydescriptor; /** * 模拟数据生成器 * @author kingapex * @version 1.0 * @since 7.1.0 * 2019-08-06 */ public class mockdatagenerator { public static string create(class clz) { stringbuffer mockstr = new stringbuffer(); propertydescriptor[] propertydescriptors = beanutils.getpropertydescriptors(clz); string objname = clz.getsimplename(); char[] chars =objname.tochararray(); chars[0]+=32; objname = string.valueof(chars); mockstr.append(clz.getname() + " "+ objname+" = new "+ clz.getname() +"();\n"); for (propertydescriptor descriptor : propertydescriptors) { if (descriptor.getwritemethod() != null) { string name = descriptor.getwritemethod().getname(); string value = createvalue( descriptor.getpropertytype()); mockstr.append(objname + "." + name + "(" + value + ");\n"); } } return mockstr.tostring(); } private static string createvalue( class clz) { if (clz.equals(java.lang.integer.class)) { return stringutil.getrandstr(3); } if (clz.equals(java.lang.double.class)) { return "1.01"; } if (clz.equals(java.lang.string.class)) { return "\"random_str"+ stringutil.getrandstr(3)+"\""; } return ""; } }