您的位置:首页 > 编程语言 > Java开发

JAVA反射--通过反射对pojo进行UT覆盖率测试

2017-08-30 16:25 495 查看
最近一直写UT单元测试,一般pojo通过程序调用,要测试pojo,直接测试action或者service就可以,但是难免还是有些pojo覆盖不到。但是上司又一直催要覆盖率,所以只能硬着头皮提升pojo的覆盖率。

下面是通过反射的方式实现的pojo覆盖率测试,如下是pojo类,基本上包括了各种数据类型,如8中基本数据类型及其包装类型,引用类型等。

/**
* @Description:   该pojo用于通过反射进行UT覆盖率测试
* @author: mengmei
*/
public class TestPojo {
//8种基本数据类型,及其包装类型
private byte b1;
private Byte b2;
private short s1;
private Short s2;
private int i1;
private Integer i2;
private float f1;
private Float f2;
private double d1;
private Double d2;
private long l1;
private Long l2;
private char c1;
private Character c2;
private boolean boo1;
private Boolean boo2;

//引用类型
private String str1;
private Date date1;
private File file1;
private List<?> list1;
private Map<?, ?> map1;
private Set<?> set1;
private List<?>[] lists;
private Map<?, ?>[] maps;
private Set<?>[] sets;
private Object object;
private static Logger logger = LoggerFactory.getLogger(TestPojo.class);

public Object getObject() {
return object;
}

public void setObject(Object object) {
this.object = object;
}

public byte getB1() {
return b1;
}

public void setB1(byte b1) {
this.b1 = b1;
}

public Byte getB2() {
return b2;
}

public void setB2(Byte b2) {
this.b2 = b2;
}

public short getS1() {
return s1;
}

public void setS1(short s1) {
this.s1 = s1;
}

public Short getS2() {
return s2;
}

public void setS2(Short s2) {
this.s2 = s2;
}

public int getI1() {
return i1;
}

public void setI1(int i1) {
this.i1 = i1;
}

public Integer getI2() {
return i2;
}

public void setI2(Integer i2) {
this.i2 = i2;
}

public float getF1() {
return f1;
}

public void setF1(float f1) {
this.f1 = f1;
}

public Float getF2() {
return f2;
}

public void setF2(Float f2) {
this.f2 = f2;
}

public double getD1() {
return d1;
}

public void setD1(double d1) {
this.d1 = d1;
}

public Double getD2() {
return d2;
}

public void setD2(Double d2) {
this.d2 = d2;
}

public long getL1() {
return l1;
}

public void setL1(long l1) {
this.l1 = l1;
}

public Long getL2() {
return l2;
}

public void setL2(Long l2) {
this.l2 = l2;
}

public char getC1() {
return c1;
}

public void setC1(char c1) {
this.c1 = c1;
}

public Character getC2() {
return c2;
}

public void setC2(Character c2) {
this.c2 = c2;
}

public boolean isBoo1() {
return boo1;
}

public void setBoo1(boolean boo1) {
this.boo1 = boo1;
}

public Boolean getBoo2() {
return boo2;
}

public void setBoo2(Boolean boo2) {
this.boo2 = boo2;
}

public String getStr1() {
return str1;
}

public void setStr1(String str1) {
this.str1 = str1;
}

public Date getDate1() {
return date1;
}

public void setDate1(Date date1) {
this.date1 = date1;
}

public File getFile1() {
return file1;
}

public void setFile1(File file1) {
this.file1 = file1;
}

public List<?> getList1() {
return list1;
}

public void setList1(List<?> list1) {
this.list1 = list1;
}

public Map<?, ?> getMap1() {
return map1;
}

public void setMap1(Map<?, ?> map1) {
this.map1 = map1;
}

public Set<?> getSet1() {
return set1;
}

public void setSet1(Set<?> set1) {
this.set1 = set1;
}

public List<?>[] getLists() {
return lists;
}

public void setLists(List<?>[] lists) {
this.lists = lists;
}

public Map<?, ?>[] getMaps() {
return maps;
}

public void setMaps(Map<?, ?>[] maps) {
this.maps = maps;
}

public Set<?>[] getSets() {
return sets;
}

public void setSets(Set<?>[] sets) {
this.sets = sets;
}
}


以下是测试类,用于测试上面的pojo,其主要思想:

/**
* 1.根据Class.forName找到类
* 2.通过clz.getDeclaredFields()获取类的所有属性,遍历,获取每个属性的名字和类型
* 3.因为pojo类字段是private私有属性,所以设置可访问
* 4.将属性name首字母变成大写,便于构建setXX和getXX方法
* 5.构建setXX和getXX方法
* 6.执行方法,用get方法给set方法赋值
*/


/**
* @Description:   该方法仅适用于单个类
* @author: mengmei
*/
public class Test {

@Test
public void test() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
//1.根据Class.forName找到类
Class<?> clz = Class.forName("com.cmread.cmu.portal.web.TestPojo");
Object object = clz.newInstance();
String name = "";
String type = "";
//2.通过clz.getDeclaredFields()获取类的所有属性,遍历,获取每个属性的名字和类型
for (Field field : clz.getDeclaredFields()) {
//3.因为pojo类字段是private私有属性,所以设置可访问
field.setAccessible(true);
//4.将属性name首字母变成大写,便于构建setXX和getXX方法
name = StringUtils.capitalize(field.getName());
type = field.getGenericType().toString();
if (name.equals("$jacocoData") || type.equals("interface org.slf4j.Logger")) {
continue;
}
//5.构建setXX和getXX方法,clz2为set方法的参数类型
Class<?> clz2 = field.getType();
Method setMethod = clz.getDeclaredMethod("set" + name,clz2);
String getMethodName = "get" + name;
if (type.equals("boolean")) {
getMethodName = "is" + name;
}
Method getMethod = clz.getDeclaredMethod(getMethodName);
//6.执行方法,用get方法给set方法赋值
setMethod.invoke(object, getMethod.invoke(object));
}
}
}


覆盖率如下:

以上test()方法目前只能用于测试单个pojo类,运行该方法覆盖率几乎可以100%。(覆盖率测试工具Eclemma:http://update.eclemma.org/,是eclipse的插件,可自行下载)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java反射 UT
相关文章推荐