分享一个我写的自动化模型填充测试工具类日志开关工具类

该类可以实现自动类型判断模拟一些比较合理的数据,比如对于时间字段对于昵称字段对于头像字段的假数据自动填充。

在服务器接口还没出来的情况,要模拟模型数据填充,最快的方法当然是我这个测试工具类了.
用法:

 if (BuildConfig.DEBUG) {
            return TestUtils.createModeListAndFillField(DetailPersonModel.class);
        }
//或者
TestUtils.createModelAndFillField(model.class);

有一些不严谨,比如对类型的判断,不够我自己够用,各位自己遇到问题的欢迎改改,我再提交一下。



package cn.qssq666.test;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Random;

import cn.qssq666.quickdevelopframe.db.ReflectUtils;
import cn.qssq666.quickdevelopframe.utils.Prt;

/**
 * Created by qssq on 2017/11/3 qssq666@foxmail.com luozheng
 */

public class TestUtils {
    private static final String TAG = "TestUtils";
    public static String[] strs = new String[]{"我很快乐", "这他妈是为什么", "妈的智障", "又犯二了", "口头禅是什么东西?", "非诚勿扰", "你好世界", "一万个理由"};
    public static String[] images = new String[]{"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1509690990292&di=6cd521ecac68df8734bbdea15fb98c35&imgtype=0&src=http%3A%2F%2Fwww.zhlzw.com%2FUploadFiles%2FArticle_UploadFiles%2F201204%2F20120412123914329.jpg"
            , "https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=2618776981,1527535159&fm=27&gp=0.jpg"
            , "https://ss0.baidu.com/-Po3dSag_xI4khGko9WTAnF6hhy/image/h%3D220/sign=c043c32e8c44ebf87271633de9f9d736/2e2eb9389b504fc27e414a28eedde71190ef6d85.jpg"
            , "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1509691068813&di=3709acd4a6b08c2e9c481023fee85614&imgtype=0&src=http%3A%2F%2Fxnnews.com.cn%2Fwenyu%2Flxsj%2F201709%2FW020170928748935368882.jpg",
            "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1509690990292&di=ea8d7cb0c080087258a553a999cf612e&imgtype=0&src=http%3A%2F%2Fwww.zhlzw.com%2FUploadFiles%2FArticle_UploadFiles%2F201204%2F20120412123926750.jpg", "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1509691069176&di=f81ea7c885ea5447cdd481dd811b5c14&imgtype=0&src=http%3A%2F%2Fimg5.duitang.com%2Fuploads%2Fitem%2F201505%2F27%2F20150527064518_CRne2.jpeg"
    };
    public static String[] nicknames = new String[]{"张三", "李四", "王老五", "小二", "老二", "阿猫", "蠢猪", "萝莉", "白痴", "混蛋", "二逼青年", "逗比"};
    public static int[] ints = new int[]{1, 2, 3, 4, 5, 6, 7, 8};
    public static long[] durations = new long[]{1000 * 60 + (1000 * 50), 1000 * 90 + (5000 * 50), 1000 * 60 + (1000 * 550), 1000 * 60 + (1000 * 55550)};
    public static int[] numbers = new int[]{1000, 2111111, 33434343, 333433444, 33434335, 3343436, 7334334, 3333338};
    public static String[] urls = new String[]{"http://baidu.com", "http://qssq666.cn"};
    private static long[] times = new long[]{
            new Date().getTime(), addTime(Calendar.DAY_OF_WEEK, 1), addTime(Calendar.DAY_OF_WEEK, 55), addTime(Calendar.DAY_OF_WEEK, 10), addTime(Calendar.DAY_OF_WEEK, 133)

    };

    public static Calendar getCalendarInstance() {
        if (instance == null) {
            instance = Calendar.getInstance(Locale.CHINA);
        }
        return instance;
    }

    private static Calendar instance;

    static {

        instance.setTimeInMillis(new Date().getTime());

    }

    private static long setTime(int field, int value) {
        getCalendarInstance().set(field, value);
        return getCalendarInstance().getTimeInMillis();
    }

    private static long addTime(int field, int value) {
        getCalendarInstance().add(field, value);
        return getCalendarInstance().getTimeInMillis();
    }


    public static String getRandomImage() {
        return images[new Random().nextInt(images.length)];
    }

    public static String getRandomName() {
        return nicknames[new Random().nextInt(nicknames.length)];
    }

    public static String getRandomTitle() {
        return strs[new Random().nextInt(strs.length)];
    }

    public static String getRandomUrl() {
        return urls[new Random().nextInt(urls.length)];
    }

    public static int getRandomInts() {
        return ints[new Random().nextInt(ints.length)];
    }

    public static <T> void createModelAndFillField(List list, Class<T> srcClass, int count) {
        for (int i = 0; i < count; i++) {
            list.add(createModelAndFillField(srcClass));
        }
    }

    public static <T> List<T> createModeListAndFillField(Class<T> srcClass) {
        return createModeListAndFillField(srcClass, 5);
    }

    public static <T> List<T> createModeListAndFillField(Class<T> srcClass, int count) {
        ArrayList list = new ArrayList<>();
        createModelAndFillField(list, srcClass, count);
        return list;
    }

    public static <T> T createModelAndFillField(Class<T> srcClass) {
        T srcObject = null;
        try {
            srcObject = srcClass.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
            return null;
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            return null;
        }
        boolean isChildClass = true;
//        ArrayList<String> hasCallMethods = new ArrayList<>();
        while (srcClass != null && srcClass != Object.class) {
            Field[] fieldsSrc = srcClass.getDeclaredFields();

            Prt.w(TAG, "正在给类自动赋值:" + srcClass.getName());

            for (int i = 0; i < fieldsSrc.length; i++) {
                Field fieldSrc = fieldsSrc[i];
                if (fieldSrc.isSynthetic()) {
                    continue;
                }
                if ("serialVersionUID".equals(fieldSrc.getName())) {
                    continue;
                }
                //public static final long com.buyao.buliao.bean.DetailPersonModel.serialVersionUID
                String getMethodName = ReflectUtils.getGetName(fieldSrc);

                String setMethodName = ReflectUtils.getSetName(fieldSrc);
              /*  if (hasCallMethods.contains(setMethodName)) {//理论上不存在。没有字段就自然不会调用子类方法。

                    Prt.w(TAG, "忽略父类,因为子类已经赋值 " + setMethodName);
                    continue;
                }*/

                try {

                    Method getMethod = srcClass.getMethod(getMethodName);
                    Method setMethod = srcClass.getMethod(setMethodName, getMethod.getReturnType());

                    Object invoke = null;
                    switch (fieldSrc.getName()) {
                        case "face":
                        case "image":
                            invoke = TestUtils.getRandomImage();
                            break;
                        case "id":
                        case "userid":
                            invoke = TestUtils.getRandomInts();
                            break;
                        case "url":
                            invoke = TestUtils.getRandomUrl();
                            break;
                        case "name":
                        case "nickname":
                        case "username":
                        case "uname":
                            invoke = TestUtils.getRandomName();
                        case "title":
                        case "content":
                            invoke = TestUtils.getRandomTitle();
                            break;
                        case "regtime":
                        case "endime":
                            invoke = TestUtils.getRandomTime();
                            break;
                        default:
                            String name = fieldSrc.getName();
                            if (name.contains("count") || name.contains("num")) {
                                invoke = TestUtils.getRandomNumber();
                            } else if (name.contains("duration")) {
                                invoke = getRandomDuration();
                            }
                            break;

                    }

                    Prt.d(TAG, "" + getMethodName + ":" + invoke + ",setMethod:" + setMethod);
                    if (invoke != null) {
                        setMethod.invoke(srcObject, invoke);
                    }


                } catch (NoSuchMethodException e) {
                    e.printStackTrace();

                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }

            }

            srcClass = (Class<T>) srcClass.getSuperclass();

        }

        Prt.d(TAG, "创建测试对象结果:" + srcObject);
        return srcObject;
    }

    public static int getRandomNumber() {
        return numbers[new Random().nextInt(numbers.length)];
    }

    public static long getRandomDuration() {
        return durations[new Random().nextInt(durations.length)];
    }

    public static long getRandomTime() {
        return times[new Random().nextInt(times.length)];
    }

}

日志开关工具类用于解决Log在编译后一直打印问题优化性能也方便控制.使用时把所有的Log.替换为Prt. 然后把导入包的也批量替换一下就完成了优化。怎么替换需要技巧的。

/*
 *
 *                     .::::.
 *                   .::::::::.
 *                  :::::::::::  by qssq666@foxmail.com
 *              ..:::::::::::'
 *            '::::::::::::'
 *              .::::::::::
 *         '::::::::::::::..
 *              ..::::::::::::.
 *            ``::::::::::::::::
 *             ::::``:::::::::'        .:::.
 *            ::::'   ':::::'       .::::::::.
 *          .::::'      ::::     .:::::::'::::.
 *         .:::'       :::::  .:::::::::' ':::::.
 *        .::'        :::::.:::::::::'      ':::::.
 *       .::'         ::::::::::::::'         ``::::.
 *   ...:::           ::::::::::::'              ``::.
 *  ```` ':.          ':::::::::'                  ::::..
 *                     '.:::::'                    ':'````..
 *
 */

package cn.qssq666.quickdevelopframe.utils;

import android.util.Log;

/**
 * Created by qssq on 2017/8/8 qssq666@foxmail.com
 */

public class Prt {

    private static final int ERROR_FLAG = -1;
    private static final String ERROR_STR = "Prt";
    public static boolean LOGGABLE = true;

    public static int v(String tag, String msg) {
        if (!LOGGABLE) {
            return ERROR_FLAG;
        }
        return Log.v(tag, msg);
    }

    public static int v(String tag, String msg, Throwable tr) {
        if (!LOGGABLE) {
            return ERROR_FLAG;
        }
        return Log.v(tag, msg, tr);
    }

    public static int d(String tag, String msg) {
        if (!LOGGABLE) {
            return ERROR_FLAG;
        }
        return Log.d(tag, msg);
    }

    public static int d(String tag, String msg, Throwable tr) {
        if (!LOGGABLE) {
            return ERROR_FLAG;
        }
        return Log.d(tag, msg, tr);
    }

    public static int i(String tag, String msg) {
        if (!LOGGABLE) {
            return ERROR_FLAG;
        }
        return Log.i(tag, msg);
    }

    public static int i(String tag, String msg, Throwable tr) {
        if (!LOGGABLE) {
            return ERROR_FLAG;
        }
        return Log.i(tag, msg, tr);
    }

    public static int w(String tag, String msg) {
        if (!LOGGABLE) {
            return ERROR_FLAG;
        }
        return Log.w(tag, msg);
    }

    public static int w(String tag, String msg, Throwable tr) {
        if (!LOGGABLE) {
            return ERROR_FLAG;
        }
        return Log.w(tag, msg, tr);
    }

    public static int w(String tag, Throwable tr) {
        if (!LOGGABLE) {
            return ERROR_FLAG;
        }
        return Log.w(tag, tr);

    }

    public static int e(String tag, String msg) {
        if (!LOGGABLE) {
            return ERROR_FLAG;
        }
        return Log.e(tag, msg);
    }

    public static int e(String tag, String msg, Throwable tr) {
        if (!LOGGABLE) {
            return ERROR_FLAG;
        }
        return Log.e(tag, msg, tr);
    }


    public static String getStackTraceString(Throwable t) {
        if (!LOGGABLE) {
            return ERROR_STR;
        }
        return Log.getStackTraceString(t);
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容