JAVA反射--通过反射对pojo进行UT覆盖率测试
2017-08-30 16:25
495 查看
最近一直写UT单元测试,一般pojo通过程序调用,要测试pojo,直接测试action或者service就可以,但是难免还是有些pojo覆盖不到。但是上司又一直催要覆盖率,所以只能硬着头皮提升pojo的覆盖率。
下面是通过反射的方式实现的pojo覆盖率测试,如下是pojo类,基本上包括了各种数据类型,如8中基本数据类型及其包装类型,引用类型等。
以下是测试类,用于测试上面的pojo,其主要思想:
覆盖率如下:
以上test()方法目前只能用于测试单个pojo类,运行该方法覆盖率几乎可以100%。(覆盖率测试工具Eclemma:http://update.eclemma.org/,是eclipse的插件,可自行下载)
下面是通过反射的方式实现的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反射 -- 通过反射注入service/dao,进行UT测试
- Java 通过反射原理,通过Map转为Java POJO对象,适用于对象包含List,Map,数组等
- 通过 jmeter 进行java采样测试
- 如何通过java反射的方式对java私有方法进行单元测试
- redis在Java中通过Junit进行连接测试
- Java中String不可变性以及通过反射进行修改
- Java项目通过JMeter进行压力测试
- 使用Java在本地创建一个服务器 ,通过浏览器对其进行访问的一个简单测试
- 黑马程序员--Java基础加强--15.利用反射操作泛型IV【通过反射Method解析泛型方法思路】【通过Method对四种Type子接口类型进行解剖】【使用递归对任意复合泛型类型进行彻底解剖】【个人
- [软件测试] - No.6 使用μJava进行变异测试
- JAVA--封装三角型 梯形 圆形三个类,用一个程序执行入口对三类对象进行测试
- java中使用反射获取pojo(实体)类的所有字段值
- 编写JAVA代码在生产环境启用临时端口进行telnet网络测试
- JAVA 使用反射进行动态编译
- 一个Java小例子(通过Radio进行选中查询)
- 通过java反射获取任意对象的字段名及字段值
- java 反射通过get方法获得属性值
- String是final类,常规情况下其值是不可变的。但是可以通过非常规方法——反射进行修改
- TPTP(Java Profiling Tools插件)对Java程序进行性能测试
- flex ibatis java 通过sql语句进行多条件模糊查询。