實(shí)體類自動(dòng)化測試用例

參考:https://blog.csdn.net/jdzms23/article/details/17550119


import org.testng.annotations.Test;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.URL;
import java.net.URLDecoder;
import java.sql.Timestamp;
import java.util.*;

public class BeanAutoTest {

    private List<String> getPackageList() {
        List<String> packageList = new ArrayList<>();
        packageList.add("com.test.dto");
        packageList.add("com.test.vo");
        packageList.add("com.test.entity");
        return packageList;
    }


    @Test
    public void test() {
        List<String> packageList = getPackageList();

        for (String packageName : packageList) {
            Set<Class<?>> classes = getClasses(packageName);
            for (Class<?> clazz : classes) {
                autoTest(clazz);
            }
        }
    }


    public static Set<Class<?>> getClasses(String packageName) {
        Set<Class<?>> classes = new HashSet<>();

        try {
            String packageDirName = packageName.replace('.', '/');
            Enumeration<URL> urls = Thread.currentThread().getContextClassLoader().getResources(packageDirName);
            while (urls.hasMoreElements()) {
                URL url = urls.nextElement();
                // 得到協(xié)議的名稱
                String protocol = url.getProtocol();
                if ("file".equals(protocol)) {
                    // 獲取包的物理路徑
                    String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
                    // 以文件的方式掃描整個(gè)包下的文件,并添加到集合中
                    findAndAddClassesInPackageByFile(packageName, filePath, true, classes);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return classes;
    }


    public static void findAndAddClassesInPackageByFile(String packageName, String packagePath, boolean recursive, Set<Class<?>> classes) {
        File dir = new File(packagePath);
        if (!dir.exists() || !dir.isDirectory()) {
            return;
        }

        // 獲取包下的所有文件,包括目錄
        File[] dirFiles = dir.listFiles(new FileFilter() {
            // 自定義過濾規(guī)則: 目錄(迭代) 或 以.class結(jié)尾的文件
            public boolean accept(File file) {
                return (recursive && file.isDirectory()) || (file.getName().endsWith(".class"));
            }
        });

        if (null != dirFiles) {
            // 循環(huán)所有文件
            for (File file : dirFiles) {
                // 如果是目錄 則繼續(xù)掃描
                if (file.isDirectory()) {
                    String subPackageName = packageName + "." + file.getName();
                    findAndAddClassesInPackageByFile(subPackageName, file.getAbsolutePath(), recursive, classes);
                } else {
                    // 如果以.class結(jié)尾的文件,只留下類名
                    String className = file.getName().substring(0, file.getName().length() - 6);
                    try {
                        classes.add(Class.forName(packageName + '.' + className));
                    } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }


    private void autoTest(Class<?> clazz) {
        try {
            Method[] methods = clazz.getMethods();
            for (Method method : methods) {
                Object obj = clazz.newInstance();
                String name = method.getName();
                if (name.startsWith("set")) {
                    // set方法調(diào)用
                    Class<?>[] parameterTypes = method.getParameterTypes();
                    // 只調(diào)用擁有唯一參數(shù)的set方法
                    if (parameterTypes.length == 1) {
                        Class<?> parameterType = parameterTypes[0];
                        if (parameterType == String.class) {
                            method.invoke(obj, "");
                        } else if (parameterType == BigInteger.class) {
                            method.invoke(obj, BigInteger.valueOf(123));
                        } else if (parameterType == BigDecimal.class) {
                            method.invoke(obj, BigDecimal.valueOf(123));
                        } else if (parameterType == int.class || parameterType == Integer.class) {
                            method.invoke(obj, 123);
                        } else if (parameterType == short.class || parameterType == Short.class) {
                            method.invoke(obj, (short) 123);
                        } else if (parameterType == long.class || parameterType == Long.class) {
                            method.invoke(obj, 123L);
                        } else if (parameterType == double.class || parameterType == Double.class) {
                            method.invoke(obj, 123.123D);
                        } else if (parameterType == Date.class) {
                            method.invoke(obj, new Date());
                        } else if (parameterType == List.class) {
                            method.invoke(obj, new ArrayList<Object>());
                        } else if (parameterType == boolean.class || parameterType == Boolean.class) {
                            method.invoke(obj, true);
                        } else if (parameterType == Map.class) {
                            method.invoke(obj, new HashMap<Object, Object>());
                        } else if (parameterType == Set.class) {
                            method.invoke(obj, new HashSet<Object>());
                        } else if (parameterType == Timestamp.class) {
                            method.invoke(obj, Timestamp.valueOf("2019-11-02 12:00:00"));
                        } else if (parameterType == String[].class) {
                            method.invoke(obj, new Object[1]);
                        } else if (parameterType == int[].class || parameterType == Integer[].class) {
                            method.invoke(obj, new Object[1]);
                        } else {
                            method.invoke(obj, parameterType.newInstance());
                        }
                    }
                } else if (name.startsWith("get")) {
                    // get方法調(diào)用
                    Class<?>[] cls = method.getParameterTypes();
                    // 只調(diào)用無參數(shù)的get方法
                    if (cls.length == 0) {
                        method.invoke(obj);
                    }
                }
            }
        } catch (IllegalAccessException | InstantiationException | InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末补履,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子剿另,更是在濱河造成了極大的恐慌箫锤,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雨女,死亡現(xiàn)場離奇詭異谚攒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)氛堕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門馏臭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人讼稚,你說我怎么就攤上這事括儒。” “怎么了锐想?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵帮寻,是天一觀的道長。 經(jīng)常有香客問我痛倚,道長规婆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任蝉稳,我火速辦了婚禮抒蚜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘耘戚。我一直安慰自己嗡髓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布收津。 她就那樣靜靜地躺著饿这,像睡著了一般浊伙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上长捧,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天嚣鄙,我揣著相機(jī)與錄音,去河邊找鬼串结。 笑死哑子,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肌割。 我是一名探鬼主播卧蜓,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼把敞!你這毒婦竟也來了弥奸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤奋早,失蹤者是張志新(化名)和其女友劉穎盛霎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伸蚯,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡摩渺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剂邮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片画饥。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡火脉,死狀恐怖局待,靈堂內(nèi)的尸體忽然破棺而出亡问,到底是詐尸還是另有隱情,我是刑警寧澤引瀑,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布狂芋,位于F島的核電站,受9級(jí)特大地震影響憨栽,放射性物質(zhì)發(fā)生泄漏帜矾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一屑柔、第九天 我趴在偏房一處隱蔽的房頂上張望屡萤。 院中可真熱鬧,春花似錦掸宛、人聲如沸死陆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽措译。三九已至别凤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間领虹,已是汗流浹背规哪。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掠械,地道東北人由缆。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓注祖,卻偏偏與公主長得像猾蒂,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子是晨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容