2、泛型方法

从来没写过泛型方法,这次项目中用到了。
泛型方法理解:
(1)对比泛型类,List<E>,我的理解是:泛型为了防止不必要的强制类型转换,降低出错几率。
(2)public static <T> void verifyObject(T actualObject, T expectObject, List<Object> ignore) {...}
传给这个方法什么类型,它就是什么类型,不需要类型转换。
如果此处换成verifyObject(Object actualObject)... 使用时可能需要强制类型转换

    /**
     * 比较两个list中每个对象的每个属性(被忽略的除外)的值是否一致
     * @param actualObject
     * @param expectObject
     * @param ignore
     */
    public static <T> void verifyObject(T actualObject, T expectObject, List<Object> ignore) {
        try {
            List<Object> actualList = new ArrayList<Object>();
            List<Object> expectList = new ArrayList<Object>();
            // 判断actualObject的类型,如果是List,就强制转换成List,如果不是,就放到一个List里面
            if(actualObject instanceof List && expectObject instanceof List) {
                actualList = (List<Object>)actualObject;
                expectList = (List<Object>)expectObject;
            } else {
                actualList.add(actualObject);
                expectList.add(expectObject);
            }
            // 如果为空,不校验
            if((actualList == null && expectList == null)) {
                return ;
            } else {
                for(int j=0; j<actualList.size(); j++) {
                    Object actual = actualList.get(j);
                    Object expect = expectList.get(j);
                    if(actual == null && expect == null) {
                        return ;
                    }
                    verifySingleObject(actual, expect, ignore);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            String errorMessage = "表里的记录和预期记录验证不一致";
            Assert.fail(errorMessage);
        }
    }
    
    /**
     * 比较两个对象的属性值是否一致
     * @param actual
     * @param expect
     * @param ignore
     */
    private static void verifySingleObject(Object actual, Object expect, List<Object> ignore) {
        try {
            Class cla = actual.getClass();
            Field[] actualFields = actual.getClass().getDeclaredFields();
            Field[] expectFields = expect.getClass().getDeclaredFields();
            // 遍历get方法
            for(Field f : actualFields) {
                pd = new PropertyDescriptor(f.getName(), cla);
                getMethod = pd.getReadMethod();
                if(ignore==null || ignore.contains(getMethod.invoke(actual))) {
                    Assert.assertEquals(getMethod.invoke(actual), getMethod.invoke(expect), 
                            "["+getMethod.getName()+"]实际值:"+getMethod.invoke(actual) + "和预期值:" + getMethod.invoke(expect) + "验证不一致");
                }
            }
        } catch (Exception e) {
            logger.error(e.getMessage());
            String errorMessage = "表里的记录和预期记录验证不一致";
            Assert.fail(errorMessage);
        }finally{
            pd = null;
            getMethod =null;
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、什么是泛型方法: 就是方法的模型,给定具体的类型,就可以实例化出一个操作该类型的具体方法。 注意:泛型类中可以...
    今天庹阅读 252评论 0 0
  • 泛型(Generics) 泛型代码允许你定义适用于任何类型的,符合你设置的要求的,灵活且可重用的 函数和类型。泛型...
    果啤阅读 698评论 0 0
  • 开发人员在使用泛型的时候,很容易根据自己的直觉而犯一些错误。比如一个方法如果接收List作为形式参数,那么如果尝试...
    时待吾阅读 1,073评论 0 3
  • 文章作者:Tyan博客:noahsnail.com 1. 什么是泛型 Java泛型(Generics)是JDK 5...
    SnailTyan阅读 783评论 0 3
  • 近日忽然对硬笔字感兴趣了。毕竟工作中常用的是硬笔字,太差劲的字写出来自己都不好意思。通过微信,发现了阿布老师...
    金明啊阅读 1,833评论 0 2