提要:
工作中需要做Junit测试报告给客户,后端增加方法需要覆盖到,因此需要前端业务数据做分支测试以便覆盖相关功能。
业务复杂、数据类型复杂,需要大量的table数据和控制分支数据。业务对象复杂,对象属性多为其他类型对象或者对象数组,以及基本类型数据。编写号junit类后构建传入对象要疯了的感觉。大片大片的对象数组,数组套数组而且数量比较大。
思路:
首先考虑到的是序列化整个入参对象到本地,然后直接将该对象引入到junit中进行测试。比较省时省力(懒惰似乎是程序员的优秀品质),但项目中几近全部类并没有实现序列化接口,经过了半晚上的该项目代码尝试后仍未成功,果断放弃。一个原因是项目junit的示例代码是采用类中手写构建数据的方式,另一个是对项目代码改动比较大有一定的风险(时刻紧绷着“决不能动老代码的弦,能增则增,不然大厦倾覆尸骨无存)。
其次考虑到采用反射的方式将运行时用到的对象整个打印出来,然后再调整数据的格式,这样就是增加一个方法打印数据后删除即可。
1.首先要考虑对象是是不是数组,数组则循环判断每个对象。。。。
最终并没有用上,花了将近两天时间把对象构建完成,一个测试类为了构建数据写了将近700行,醉了,求教好方法junit数据构建。!!!!!
唉。。。看代码吧,目前测试可以取到相关值,注意点就是对象的类型判断。
下面首先是处理属性方法
package test;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.ArrayList;
public class Snippet {
public static void main(String[] args) throws Exception {
Person person = new Person(101, "John");
Person2 person2 = new Person2(102,"tom");
person.setPerson2(person2);
Person2 [] person2s = {new Person2(12, "xm"),new Person2(11, "dgc")};
int [] is = {1,2,3};
person2.setArr2(is);
Person [] personArr = {new Person(999, "this is my test")};
person2.setPersons(personArr);
person.setPerson2s(person2s);
getFiled(person);
}
//处理数组方法
static void dealArr(Object obj) {
ArrayList<Object> arra = new ArrayList<>();
if(obj.getClass().getComponentType().isPrimitive()
|| (obj.getClass().getComponentType() == String.class)) {//该数组的对象类型为基本类型、字符串类型则打印名称和整个数组
for(int i =0;i<Array.getLength(obj);i++) {//循环获取数组中的值
arra.add(Array.get(obj, i));
}
System.out.println(obj.getClass().getComponentType()+"==="+arra);
}else {//数组内的对象不满足要求,则循环每个对象并将对象继续送给处理对象的方法继续处理,知道最后一层
for(int j =0;j<Array.getLength(obj);j++) {
Object object = Array.get(obj, j);
getFiled(object);
}
}
System.out.println(obj.getClass().getComponentType());
}
//处理非数组方法
static void getFiled(Object obj) {
Class clazz = obj.getClass();
if(clazz.isArray()) {//对类型进行判断,数组则进入数组处理方法
dealArr(obj);
}else {//非数组则循环其所有属性,对属性进行类型判断
Field [] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if(field.getType().isPrimitive()
|| (field.getType() == String.class)) {//基本类型、字符串类型直接打印出来
System.out.println(field.getType()+"="+field.getName());
try {
System.out.println(field.get(obj).toString());
} catch (Exception e) {
System.out.println(e);
}
}else {//非基本类型进入该分支
System.out.println(field.getType()+"="+field.getName());
if(field.getType().isArray()) {//属性为数组情况,则将该属性对象送入数组方法处理
try {
if(null == field.get(obj)) {
System.out.println(field.getGenericType());
}else {
dealArr(field.get(obj));
}
} catch (IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
}else {//属性为对象,则进入对象处理方法。继续分解其属性
try {
if(null == field.get(obj)) {
System.out.println(field.getGenericType());
}else {
getFiled(field.get(obj));
}
} catch (IllegalArgumentException | IllegalAccessException e) {
System.out.println(e);
}
}
}
}
}
}
}
然后是测试中用到测试类1。
package test;
import java.io.Serializable;
public class Person implements Serializable{
int num;
String color;
Person2 [] person2s;
public Person2[] getPerson2s() {
return person2s;
}
public void setPerson2s(Person2[] person2s) {
this.person2s = person2s;
}
public Person(int num,String color){
this.num = num;
this.color = color;
}
public Person2 getPerson2() {
return person2;
}
public void setPerson2(Person2 person2) {
this.person2 = person2;
}
Person2 person2 ;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
然后是测试类2
package test;
import java.io.Serializable;
public class Person2 {
int arr2 [];
int person2Num;
Person [] persons;
public Person[] getPersons() {
return persons;
}
public void setPersons(Person[] persons) {
this.persons = persons;
}
String person2Color;
public Person2(int i, String string) {
this.person2Num = i;
this.person2Color = string;
}
public int getPerson2Num() {
return person2Num;
}
public int[] getArr2() {
return arr2;
}
public void setArr2(int[] arr2) {
this.arr2 = arr2;
}
public void setPerson2Num(int person2Num) {
this.person2Num = person2Num;
}
public String getPerson2Color() {
return person2Color;
}
public void setPerson2Color(String person2Color) {
this.person2Color = person2Color;
}
}