JAVA反射--通过反射对pojo进行UT覆盖率测试
生活随笔
收集整理的這篇文章主要介紹了
JAVA反射--通过反射对pojo进行UT覆盖率测试
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近一直寫UT單元測試,一般pojo通過程序調用,要測試pojo,直接測試action或者service就可以,但是難免還是有些pojo覆蓋不到。但是上司又一直催要覆蓋率,所以只能硬著頭皮提升pojo的覆蓋率。
下面是通過反射的方式實現的pojo覆蓋率測試,如下是pojo類,基本上包括了各種數據類型,如8中基本數據類型及其包裝類型,引用類型等。
?
/** * @Description: 該pojo用于通過反射進行UT覆蓋率測試 */ 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: 該方法僅適用于單個類*/ public class Test {@Testpublic 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反射--通过反射对pojo进行UT覆盖率测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 原理图端口符号_电气百科:电气原理图和接
- 下一篇: Java 产品与软件下载