1. 程式人生 > >Mockito + Testng編寫單元測試的工具類

Mockito + Testng編寫單元測試的工具類

/**
1. 將本util類原始碼加到主專案的src/test/java/目錄下
2. 修改程式碼中的path引數,
String path = "D:/workspace/xxxx-util";//專案根目錄
3. 啟動main方法,自動生成專案中所有需要進行單元測試的java檔案。

下面為單元測試原始碼
*/

/**
 * maven 依賴
 * 
    <!-- testng 支援 -->
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
        <version>1.10.19</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito</artifactId>
        <version>1.7.4</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!-- testng 支援 end -->
*/
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
 * 生產單元測試的工具類
 * ps: 只是為了單元測試覆蓋率 , 實際功能需要測試
 * 2018-04-12
 *
 */
public class CommonTestUtil {
    public static final String mainPath = "main\\java\\";
    public static final String testPath = "test\\java\\";
    public static final String endSuffix = ".java";

    public static void main(String[] args) {

        String path = "D:/workspace/xxxx-util";//專案根目錄

        CommonTestUtil.getFiles(new File(path + "/src/" + CommonTestUtil.mainPath));
    }
    /**
     * 獲取測試類主方法
     * @param clzss
     * @return
     */
    public static String getTestCode(Class<?> clzss) {
        String beanName = Character.toLowerCase(
                clzss.getSimpleName().charAt(0)) + clzss.getSimpleName().substring(1);

        StringBuilder sb = new StringBuilder();
        sb.append(clzss.getPackage().toString()).append(";").append("\r\n");
        sb.append("\r\n");
        sb.append("public class ").append(clzss.getSimpleName()).append("Test {").append("\r\n");
        sb.append("\r\n");
        //單元測試類
        sb.append("\t").append("@org.mockito.InjectMocks").append("\r\n");
        sb.append("\t").append(clzss.getName()).append(" ").append(beanName).append(";").append("\r\n");
        //@Autowired @Resource 的類
        sb.append(CommonTestUtil.getMockObj(clzss));

        //輸入引數 初始化
        Map<String, Set<String>> info = CommonTestUtil.getInfo(clzss);
        for(String str : info.get("param")) {
            sb.append("\t").append("@org.mockito.Mock").append("\r\n");
            sb.append("\t").append(str).append(";").append("\r\n");
        }
        //初始化Mockito虛擬化物件
        sb.append(CommonTestUtil.beforeClass());

        //單元測試
        for(String str : info.get("method")) {
            sb.append("\r\n");
            sb.append("\t").append("@org.testng.annotations.Test").append("\r\n");
            String testMethodName = str.substring(0, str.indexOf("(")) + "Test";
            while(sb.indexOf(testMethodName) > -1) {
                testMethodName += "1";
            }
            sb.append("\t").append("public void ").append(testMethodName).append("() {").append("\r\n");
            sb.append("\t\t").append("try{").append("\r\n");
            sb.append("\t\t\t").append(beanName).append(".").append(str).append(";").append("\r\n");
            sb.append("\t\t").append("} catch(java.lang.Throwable e) {").append("\r\n");
            sb.append("//\t\t\t").append("e.printStackTrace();").append("\r\n");
            sb.append("\t\t").append("}").append("\r\n");
            sb.append("\t}").append("\r\n");
        }
        sb.append("}");
        return sb.toString();
    }
    /**
     * 建立單元測試主方法
     * @param directory
     */
    public static void getFiles(File directory) {
        if(directory.getName().endsWith("svn")) {
            return;
        }
        File[] list = directory.listFiles();
        if(null == list || 0 == list.length) {
            return;
        }
        for(File f : list) {
            if(f.isDirectory()) {
                getFiles(f);
                continue;
            }
            if(!f.getName().endsWith(endSuffix)) {
                continue;
            }
            String absolutePath = f.getAbsolutePath();
            String qualifiedName = absolutePath.substring(
                    absolutePath.indexOf(mainPath)+10).replace("\\", ".").replace(endSuffix, "");
            Class<?> clzss = null;
            try {
                clzss = Class.forName(qualifiedName);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            if(null == clzss || !isNeedTest(clzss)) {
                continue;
            }
            StringBuilder sb = new StringBuilder().append(absolutePath.replace(mainPath, testPath));
            sb.insert(sb.lastIndexOf(endSuffix), "Test");
            File testFile = new File(sb.toString());
            //建立目錄
            if(testFile.exists()) {
                continue;
            }
            String path = sb.delete(sb.lastIndexOf("\\"), sb.length()).toString();
            createDirectory(path);
            String testCode = CommonTestUtil.getTestCode(clzss);
            BufferedWriter bw = null;
            try {
                bw = new BufferedWriter(new FileWriter(testFile));
                bw.write(testCode);
                bw.flush();
                System.out.println(testFile.getAbsolutePath());
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    bw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    /**
     * 判斷類是否符合構造單元測試類的方法
     * @param clzss
     * @return
     */
    public static boolean isNeedTest(Class<?> clzss) {
        return "public".equals(Modifier.toString(clzss.getModifiers()));
    }
    /**
     * 建立目錄及上層目錄
     * @param path
     * @return
     */
    public static boolean createDirectory(String path) {
        File f = new File(path);
        if(!f.exists()) {
            return f.mkdirs();
        }
        return true;
    }
    /**
     * 
     * @param clzss
     * @return
     */
    @SuppressWarnings("restriction")
    public static String getMockObj(Class<?> clzss) {
        StringBuilder sb = new StringBuilder();
        for(Field f : clzss.getDeclaredFields()) {
            if(f.getAnnotation(org.springframework.beans.factory.annotation.Autowired.class) != null
                    || f.getAnnotation(javax.annotation.Resource.class) != null) {
                sb.append("\t").append("@org.mockito.Mock").append("\r\n");
                sb.append("\t").append(f.getType().getName()).append(" ")
                        .append(f.getName()).append(";").append("\r\n");
            }
        }
        return sb.toString();
    }
    /**
     * init
     * @return
     */
    public static String beforeClass() {
        StringBuilder sb = new StringBuilder();
        sb.append("\t").append("@org.testng.annotations.BeforeClass").append("\r\n");
        sb.append("\t").append("public void beforeClass() {").append("\r\n");
        sb.append("\t\t").append("org.mockito.MockitoAnnotations.initMocks(this);").append("\r\n");
        sb.append("\t").append("}").append("\r\n");
        return sb.toString();
    }
    /**
     * 獲取需要測試類的 所有方法名       sss( 1, 1, 1L, 1L, false, false, dateFor, mapFor)
     * 及相應需要Mock虛擬化的引數  java.util.Map mapFor
     * @param clzss
     * @return
     */
    public static Map<String, Set<String>> getInfo(Class<?> clzss){
        Map<String, Set<String>> methodAndParam = new HashMap<String,Set<String>>();

        Set<String> methodSet = new HashSet<String>();
        Set<String> paramSet = new HashSet<String>();
        for(Method method : clzss.getDeclaredMethods()) {
            if(Modifier.toString(method.getModifiers()).indexOf("private") > -1) {
                continue;
            }
            StringBuilder tmp = new StringBuilder();

            Class<?>[] pt = method.getParameterTypes();
            if (pt != null && pt.length > 0) {
                for (Class<?> an : pt) {
                    tmp.append(", ");
                    tmp.append(getParamter(an, paramSet));
                }
            } else {
                tmp.append(",");
            }
            tmp.delete(0, 1);
            tmp.insert(0, method.getName()+"(");
            tmp.append(")");
            methodSet.add(tmp.toString());
        }
        methodAndParam.put("param", paramSet);
        methodAndParam.put("method", methodSet);
        return methodAndParam;
    }
    /**
     * 對輸入引數進行遍歷
     * @param an
     * @param paramSet
     * @return
     */
    public static String getParamter(Class<?> an, Set<String> paramSet){
        StringBuilder tmp = new StringBuilder();
        if(an.getName().startsWith("[L")) {
            String str = an.getName().substring(2, an.getName().length()-1);
            try {
                tmp.append("new ").append(str).append("[]{")
                .append(getParamter(Class.forName(str), paramSet))
                .append("}");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        } else if (String.class.equals(an)) {
            tmp.append("\"00\"");
        } else if (Boolean.class.equals(an) || "boolean".equals(an.getName())) {
            tmp.append("false");
        } else if (Integer.class.equals(an) || "int".equals(an.getName())) {
            tmp.append("1");
        } else if (Long.class.equals(an) || "long".equals(an.getName())) {
            tmp.append("1L");
        } else if (Double.class.equals(an) || "double".equals(an.getName())) {
            tmp.append("12D");
        } else if (StringBuffer.class.equals(an)) {
            tmp.append("new StringBuffer()");
        } else if (StringBuilder.class.equals(an)) {
            tmp.append("new StringBuilder()");
        } else if (List.class.equals(an)) {
            tmp.append("new java.util.ArrayList()");
        } else if (Map.class.equals(an)) {
            tmp.append("new java.util.HashMap()");
        } else if (Object.class.equals(an)) {
            tmp.append("new java.lang.Object()");
        } else {
            String paramName = Character.toLowerCase(
                    an.getSimpleName().charAt(0)) + an.getSimpleName().substring(1) + "For";
            String modi = Modifier.toString(an.getModifiers());
            if(!modi.contains("final")) {
                tmp.append(paramName);

                String param = an.getName() + " " + paramName;
                paramSet.add(param);
            } else {
                tmp.append("null");
            }
        }
        return tmp.toString();
    }
}

相關推薦

Mockito + Testng編寫單元測試工具

/** 1. 將本util類原始碼加到主專案的src/test/java/目錄下 2. 修改程式碼中的path引數, String path = "D:/workspace/xxxx-util";//專案根目錄 3. 啟動main方法,自動生成專案中所有

如何編寫單元測試-基於Spring

要求 gem res 錯誤 xxd ssp aso util ... 單元測試 首先單元測試真的算是一種“臟活累活”,但是我個人感覺還是有必要,至少本人最近開始寫單元測試後還是能發現一些“bug”的。 如何寫單元測試 單元測試的要求...網上很多。下面來分享一下我是如何寫單

OpenStack基礎知識-單元測試工具介紹

單元測試 pen mongod 大量 需要 哪些 sub 導入 使用 針對以前學的內容的一個簡單整理 1、單元測試工具介紹 unittest: 是 Python 的標準庫,提供了最基本的單元測試功能,包括 單元測試運行器(簡稱runner) 和 單元測試框架。項目的單元測試

【資料庫筆記】編寫JDBC的工具

註冊驅動和資料庫連線是固定操作,何不將這些固定操作封裝成一個類,並且提供靜態方法返回資料庫連線物件,達到程式碼的重複利用: /* * JDBC的工具類 * 用於註冊驅動,連線資料庫 */ import java.sql.Connection; import java.sql.Drive

如何用mockito來寫單元測試

一、mockito單元測試中常見的幾個註解 1. @RunWith(MockitoJUnitRunner.class) 該註解的意思以什麼容器來執行單元測試,容器的意思可以理解為執行環境可以解析你的mockito中的註解和語法的意思,這個註解一般載入在你寫的單元測試的類上如下

java-junit單元測試工具

java-junit單元測試工具 Junit下載地址:http://pan.baidu.com/s/1eQfQQw6 優點:     1.不用寫把方法寫main函式裡面進行測試。     2.不用進行人工對比。 操作: 1.匯入juni

Spring Boot學習筆記(五)—— 使用JUnit5編寫單元測試

1.開發環境 Mac OS 10.14 JDK8 Maven 3.5.3 Eclipse 4.9.0 Spring Boot 2.0.5.RELEASE JUnit 5.1.1 2.JUnit5簡介[1] JUnit 5跟以前的JUni

Java單元測試工具JUnit 5新特性一覽

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

分享一個特別好的測試http協議的測試工具

二話不說,咱直接上程式碼!!!! public class TestPost {          private static final SimpleDateFormat format = new SimpleDateFormat("y

前端單元測試工具——karma安裝使用

首先說明的是,為了學習karma專門買了一臺macbook。該教程也只能說適合mac,windows折騰了一星期沒有進展,所以不知道是不是適合windows。 第一步:     你的電腦中要裝有node.js(node安裝使用教程自行百度) 第二步:     使用

jasmine-JavaScript單元測試工具

文章目錄 Jasmine 是什麼? 快速瞭解 快速例項 語法介紹 後言 Jasmine 是什麼? jasmine是一個用來編寫Javascript測試的框架,它不依

Java單元測試工具:JUnit4(四)——JUnit測試套件使用及引數化設定

(四)JUnit測試套件使用及引數化設定         這篇筆記記錄JUnit測試套件的使用,即批量執行測試類;以及JUnit中的引數化設定。         @RunWith   當類被

Java單元測試工具:JUnit4(三)——JUnit詳解之執行流程及常用註解

(三)執行流程及常用註解         這篇筆記記錄JUnit測試類執行時,類中方法的執行順序;以及JUnit中常用的註解。 1.JUnit的執行流程 1.1 新建測試類        

Java單元測試工具:JUnit4(二)——JUnit使用詳解

(二)JUnit使用注意點及測試失敗的兩種情況         看了慕課網的JUnit視訊教程: http://www.imooc.com/learn/356,總結筆記。       &nbs

Java單元測試工具:JUnit4(一)——概述及簡單例子

(一)JUnit概述及一個簡單例子         看了慕課網的JUnit視訊教程: http://www.imooc.com/learn/356,總結筆記。         這篇筆記記錄JUnit的

Jest-Javascript單元測試工具

Jest是一個JavaScript測試框架,由Facebook用來測試所有JavaScript程式碼,包括React應用程式。 不同級別的自動化測試:單元、整合、元件和功能. 單元測試可以看作是和在元件級別測試JavaScript物件和方法

單元測試工具Junit初試

執行單元測試是要導包的,我用的Junit-4.10.jar 新建一個class類,匯入org.junit下的包。 @Before註解是測試之前需要執行的內容,@After是測試執行完後的內容,@Test是測試內容。 public class Test { @Befo

開放原始碼 C/C++ 單元測試工具,第 2 部分: 瞭解 CppUnit

https://www.ibm.com/developerworks/cn/aix/library/au-ctools2_cppunit/index.html 本文是討論開放原始碼單元測試工具的 系列文章 的第 2 篇,介紹非常受歡迎的 CppUnit — 最初由 Eri

JUnit單元測試工具

在MapReduce程式中經常用到junit來測試測試的正確性 JUnit是Java單元測試工具。這裡以一個例子說明如何在Eclipse下進行JUnit測試。首先建立一個Java專案JUnitTest,建立類math.java,其程式碼為: 1 package www.gongqingkui.cn;

CUnit使用入門-精簡的C語言單元測試工具

目的:通過一個示例演示,掌握用Cunit做單元測試 內容: 1、介紹Cunit架構 2、介紹Cunit的測試模式 3、例項演示用Cunit 寫單元測試的操作流程 1.Cunit架構 Test Registry |