接口测试需要给被测的方法塞值,有些非必传的参数也需要你一个个的set值,很麻烦。接触了公司的测试框架后发现可以生成方法的入参模板,给参数生成默认值,可以解决这个问题。
方法中参数的类型有:
简单数据类型:Date Timestamp String StringBuilder Integer Long boolean
集合:List
对象:BindOpenIdRequest
对象集合: List
处理逻辑:
1,简单类型直接返回默认值:String >'a' Integer >0 等
2,集合: List
---['a'] Map --{'a':'a'} 3,对象:BindOpenIdRequest 找出field,给field设置默认值,逻辑同1,2
4,对象集合:List
返回[BindOpenIdRequest],BindOpenIdRequest处理同3
得到方法参数的类型和class列表
Type[] genericParamTypes = method.getGenericParameterTypes();
Class>[] paramClasses = method.getParameterTypes();
循环处理每个参数
objectDefaultMaker.getDefaultValue(c, t);
递归处理参数类型,直到找出简单类型表示该参数
private T getSampleObj(Class paramClass, Type t, String fieldName) throws Exception {
if (Collection.class.isAssignableFrom(paramClass)) {
return (T) initCollection((Class) paramClass, t);
} else if (paramClass.isArray()) {
return (T) initArray(paramClass, t);
} else if (Map.class.isAssignableFrom(paramClass)) {
return (T) initMap((Class
private Collection initCollection(Class source, Type t) throws Exception {
Collection dest = null;
if (t instanceof ParameterizedType) // 【3】如果是泛型参数的类型
{
ParameterizedType pt = (ParameterizedType) t;
Type[] types = pt.getActualTypeArguments();
Type type0 = types[0];
Class class0 = null;
if (types[0] instanceof ParameterizedType) {
class0 = (Class) ((ParameterizedType) type0).getRawType();
} else {
class0 = (Class) type0;
}
if (Set.class.isAssignableFrom(source)) {
dest = Sets.newHashSet();
} else {
dest = Lists.newArrayList();
}
dest.add(getDefaultValue(class0, type0));
}
return dest;
}
反射常用到的方法
public class People {
public List getLists() {
return lists;
}
public void setLists(List lists) {
this.lists = lists;
}
List lists;
public void say(List
Method method = People.class.getMethod("say", List.class);
Class c = method.getParameterTypes()[0];
Type t = method.getGenericParameterTypes()[0];
ObjectDefaultValueMaker objectDefaultMaker = new ObjectDefaultValueMaker();
Object result = objectDefaultMaker.getDefaultValue(c, t);
System.out.println(result);
Field field = People.class.getDeclaredField("lists");
System.out.println( field.getGenericType());
System.out.println(field.getType());
结果为:
[{a=a}]
java.util.List
interface java.util.List
官方文档的说明是这样
ParameterizedType represents a parameterized type such as
Collection
主要方法:
Type[] getActualTypeArguments(); 返回 这个 Type 类型的参数的实际类型数组。 如 Map
Type getRawType() 返回的是当前这个 ParameterizedType 的类型。 如 Map
获取类的字段有两种方式:getFields()和getDeclaredFields()。
getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。
getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段。
关于field还有一种情况我们需要注意,就是当字段修饰符为private时,我们需要加上:
field.setAccessible(true);
判断方法是:if (!field.isAccessible())