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 |