package com.citi.sl.tlc.services.tlc.collateralDataProcess.util;
import java.io.BufferedWriter;
import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import org.apache.commons.lang.RandomStringUtils;
import com.google.common.collect.Lists;
public class TestCaseGenerator {
private static final String FILE_SUFFIX_LOWERCASE = ".java";
private static final String FILE_SUFFIX_UPPERCASE = ".JAVA";
public static void main(String[] args) {
generateTestCaseFiles("C:\\Users\\pz27063\\git\\xx\\src\\main\\java\\");
}
/**
* Example1 :
* C:\\Users\\pz27063\\git\\tradelifecycle\\TLCCommon\\CommonExtract\\src\\main\\java
* Example2 :
* C:\\Users\\pz27063\\git\\tradelifecycle\\TLCCommon\\CommonExtract\\src\\main\\java\\com\\citi\\sl\\tlc\\common\\extract\\jobs\\eurexeligible
*
* @param projectAbsolutePath
*/
public static void generateTestCaseFiles(String projectAbsolutePath) {
List<String> folderList = getAllSubFolders(Paths.get(projectAbsolutePath));
if (folderList.isEmpty()) {
System.out.println("folder not exist or no files.");
}
folderList.forEach(sourceDir -> {
Path sourcePath = Paths.get(sourceDir);
String testFolderStr = sourceDir.replace("\\src\\main", "\\src\\test");
Path createdTestFolderPath = createTestCaseFolder(Paths.get(testFolderStr));
createTestCaseFile(sourcePath, createdTestFolderPath);
});
}
public static List<String> getAllSubFolders(Path path) {
List<String> folders = new ArrayList<>();
try {
if (path.toFile().isDirectory()) {
folders.add(path.toFile().getAbsolutePath());
Files.list(path).forEach(f -> {
List<String> subFolders = getAllSubFolders(f);
folders.addAll(subFolders);
});
}
} catch (IOException e) {
exitProcess(e);
}
return folders;
}
private static Path createTestCaseFolder(Path createTargetPath) {
try {
if (notExists(createTargetPath)) {
return Files.createDirectories(createTargetPath);
}
} catch (IOException e) {
exitProcess(e);
}
return createTargetPath;
}
private static void createTestCaseFile(Path sourcePath, Path testFolderPath) {
try {
Files.list(sourcePath).forEach(sourceFilePath -> {
if (sourceFilePath.toFile().isFile() && (sourceFilePath.toString().endsWith(FILE_SUFFIX_UPPERCASE)
|| sourceFilePath.toString().endsWith(FILE_SUFFIX_LOWERCASE))) {
buildTestClass(sourceFilePath, testFolderPath);
}
});
} catch (IOException e) {
exitProcess(e);
}
}
private static void buildTestClass(Path sourceFilePath, Path targetFolder) {
String className = sourceFilePath.getFileName().toString().replace(FILE_SUFFIX_LOWERCASE, "");
try {
Path newTestFilePath = targetFolder.resolve(className + "Test" + FILE_SUFFIX_LOWERCASE);
if (notExists(newTestFilePath)) {
String javaPath = convertPathToPackageClass(sourceFilePath);
Class<?> sourceClass = getSourceClass(javaPath);
if (isJavaBean(sourceClass)) {
newTestFilePath = Files.createFile(newTestFilePath);
writeJavaBeanTestClass(sourceClass, newTestFilePath);
System.out.println("JavaBean :" + newTestFilePath.toString() + " created.");
} else if (isNotAbstract(sourceClass) && isNotInterface(sourceClass) && isNotEnum(sourceClass)) {
newTestFilePath = Files.createFile(newTestFilePath);
writeTestClass(sourceClass, newTestFilePath);
System.out.println(newTestFilePath.toString() + " created.");
}
}
} catch (IOException e) {
exitProcess(e);
}
}
private static void writeTestClass(Class<?> sourceClass, Path newTestFilePath) {
String className = sourceClass.getSimpleName();
Set<String> methodNames = getClassPublicMethods(sourceClass);
Map<String, Object> methodMap = getMethodMap(sourceClass);
String packageLine = sourceClass.getPackage().toString();
BufferedWriter writer = null;
try {
writer = Files.newBufferedWriter(newTestFilePath);
StringBuilder fileBuilder = new StringBuilder();
fileBuilder.append(packageLine + ";\n");
fileBuilder.append("\n");
String importPackage = "import org.mockito.InjectMocks;\r\n" + "import org.mockito.MockitoAnnotations;\r\n"
+ "import org.junit.Before;\r\n" + "import org.junit.Test;";
fileBuilder.append(importPackage);
fileBuilder.append("\n");
fileBuilder.append("public class " + className + "Test{\n");
fileBuilder.append("\n");
fileBuilder.append("\t");
fileBuilder.append("@InjectMocks\n");
fileBuilder.append("\t");
fileBuilder.append("private " + className + " "
+ className.substring(0, 1).toLowerCase().concat(className.substring(1)) + ";\n");
fileBuilder.append(getInitMethodString());
for (String methodName : methodNames) {
fileBuilder.append(generateTestMethod(methodName, methodMap));
}
fileBuilder.append("\n\n}");
writer.write(fileBuilder.toString());
} catch (IOException e) {
exitProcess(e);
} finally {
if (null != writer) {
try {
writer.close();
} catch (IOException e) {
exitProcess(e);
}
}
}
}
private static void writeJavaBeanTestClass(Class<?> sourceClass, Path newTestFilePath) {
String className = sourceClass.getSimpleName();
String packageLine = sourceClass.getPackage().toString();
BufferedWriter writer = null;
try {
writer = Files.newBufferedWriter(newTestFilePath);
StringBuilder fileBuilder = new StringBuilder();
fileBuilder.append(packageLine + ";\n");
fileBuilder.append("\n");
fileBuilder.append(generateJavaBeanTestClass(sourceClass.getPackage().getName(), className));
writer.write(fileBuilder.toString());
} catch (IOException e) {
exitProcess(e);
} finally {
if (null != writer) {
try {
writer.close();
} catch (IOException e) {
exitProcess(e);
}
}
}
}
private static String generateJavaBeanTestClass(String packageName, String className) {
String packageImport = "import java.beans.PropertyDescriptor;\r\n" + "import java.lang.reflect.Field;\r\n"
+ "import java.lang.reflect.Method;\r\n" + "\r\n" + "import org.junit.Before;\r\n"
+ "import org.junit.Test;\r\n" + "import org.mockito.InjectMocks;\r\n"
+ "import org.mockito.MockitoAnnotations;\n";
String classBodyStart = "public class " + className + "Test{\n";
String method = " \r\n" + " @InjectMocks\r\n" + " private " + className + " "
+ className.substring(0, 1).toLowerCase().concat(className.substring(1, className.length())) + ";\r\n"
+ "\r\n" + " @Before\r\n" + " public void initMocks(){\r\n"
+ " MockitoAnnotations.initMocks(this);\r\n" + " }\r\n" + " @Test\r\n"
+ " public void testSetGetMethod() {\r\n" + " try {\r\n"
+ " Class<?> clazz = Class.forName(\"" + packageName + "." + className + "\");\r\n"
+ " Object obj = clazz.newInstance();\r\n"
+ " Field[] fields = clazz.getDeclaredFields();\r\n"
+ " for (Field f : fields) {\r\n" + " try {\r\n"
+ " PropertyDescriptor pd = new PropertyDescriptor(f.getName(), clazz);\r\n"
+ " Method writeMethod = pd.getWriteMethod();\r\n"
+ " writeMethod.invoke(obj, new Object[] { null });\r\n"
+ " Method readMethod = pd.getReadMethod();\r\n"
+ " readMethod.invoke(obj);\r\n" + " } catch (Exception e) {\r\n"
+ " System.out.println(e);\r\n" + " }\r\n" + " }\r\n"
+ " } catch (Exception e) {\r\n" + " System.out.println(e);\r\n" + " }\r\n" + "\r\n"
+ " }";
String classBodyEnd = "}";
StringBuilder builder = new StringBuilder();
builder.append(packageImport);
builder.append("\n\n");
builder.append(classBodyStart);
builder.append(method);
builder.append(classBodyEnd);
return builder.toString();
}
private static boolean isJavaBean(Class<?> sourceClass) {
String fullPackage = sourceClass.getPackage().getName().toLowerCase();
return (fullPackage.endsWith(".bean") || fullPackage.endsWith(".entity") || fullPackage.endsWith(".beans")
|| fullPackage.endsWith(".entities"));
}
private static String generateTestMethod(String methodName, Map<String, Object> methodMap) {
StringBuilder methodBuilder = new StringBuilder();
String className = (String) methodMap.get("className");
Object[] methodObj = (Object[]) methodMap.get(methodName);
Class<?> returnType = (Class<?>) methodObj[0];
Class[] paramTypes = (Class[]) methodObj[1];
List<Class<?>> paramTypeList = Arrays.asList(paramTypes);
List<String> paramTypeParam = Lists.newArrayList();
List<String> stringList = Lists.newArrayList("String");
List<String> intList = Lists.newArrayList("int", "Integer");
List<String> longList = Lists.newArrayList("Long", "long");
List<String> doubleList = Lists.newArrayList("Double", "double");
List<String> shortList = Lists.newArrayList("Short", "short");
List<String> floatList = Lists.newArrayList("Float", "float");
List<String> booleanList = Lists.newArrayList("boolean");
List<String> charList = Lists.newArrayList("Char", "char");
List<String> byteList = Lists.newArrayList("Byte", "byte");
for (Class<?> paramClass : paramTypeList) {
// String paramClsStr = paramClass.getSimpleName().toUpperCase();
String paramClsStr = paramClass.getSimpleName();
if (stringList.contains(paramClsStr)) {
paramTypeParam.add("\"" + RandomStringUtils.randomAlphabetic(3) + "\"");
} else if (intList.contains(paramClsStr)) {
paramTypeParam.add("0");
} else if (longList.contains(paramClsStr)) {
paramTypeParam.add("1L");
} else if (doubleList.contains(paramClsStr)) {
paramTypeParam.add("1D");
} else if (shortList.contains(paramClsStr)) {
paramTypeParam.add("1");
} else if (floatList.contains(paramClsStr)) {
paramTypeParam.add("1F");
} else if (booleanList.contains(paramClsStr)) {
paramTypeParam.add("true");
} else if (charList.contains(paramClsStr)) {
paramTypeParam.add("\'A\'");
} else if (byteList.contains(paramClsStr)) {
paramTypeParam.add("10");
} else {
if (paramClsStr instanceof Object && !paramClass.isEnum() && !paramClass.isInterface()
&& !paramClass.isArray()) {
paramTypeParam.add("new " + paramClass.getName() + "()");
} else {
paramTypeParam.add("null");
}
}
}
String paramStr = String.join(",", paramTypeParam);
String returnCode = "";
String returnClassName = returnType.getSimpleName();
if (!returnClassName.equals("void")) {
returnCode = returnType.getName() + " result = ";
}
String methodBody = "\t@Test\r\n" + " public void test"
+ methodName.substring(0, 1).toUpperCase().concat(methodName.substring(1)) + "(){\r\n" + "\t\ttry{\r\n"
+ "\t\t\t" + returnCode
+ className.substring(0, 1).toLowerCase().concat(className.substring(1, className.length())) + "."
+ methodName + "(" + paramStr + ");\r\n" + "\t\t}catch (Exception e) {\n\t\t}\n" + "\n\t}\n\n";
methodBuilder.append(methodBody);
return methodBuilder.toString();
}
private static String getInitMethodString() {
StringBuilder methodBuilder = new StringBuilder();
methodBuilder.append("\n");
methodBuilder.append("\t@Before\n");
methodBuilder.append("\t");
methodBuilder.append("public void initMocks(){\n");
methodBuilder.append("\t\tMockitoAnnotations.initMocks(this);\n");
methodBuilder.append("\t}");
methodBuilder.append("\n");
return methodBuilder.toString();
}
private static String convertPathToPackageClass(Path sourcePath) {
String fileName = "";
fileName = sourcePath.getFileName().toString().replace(".java", "");
String packageName = getPackageName(sourcePath);
return packageName + "." + fileName;
}
private static String getPackageName(Path sourcePath) {
try {
Optional<String> optional = Files.lines(sourcePath).findFirst();
if (optional.isPresent()) {
return optional.get().replace("package ", "").replace(";", "");
}
} catch (IOException e) {
exitProcess(e);
}
return "";
}
private static boolean isNotAbstract(Class<?> cls) {
return !Modifier.isAbstract(cls.getModifiers());
}
private static boolean isNotInterface(Class<?> cls) {
return !Modifier.isInterface(cls.getModifiers());
}
private static boolean isNotEnum(Class<?> cls) {
return !cls.isEnum();
}
private static Set<String> getClassPublicMethods(Class<?> cls) {
Set<String> methodSet = new HashSet<>();
Method[] publicMethods = cls.getDeclaredMethods();
for (Method m : publicMethods) {
if (Modifier.isPublic(m.getModifiers()) || Modifier.isProtected(m.getModifiers())) {
methodSet.add(m.getName());
}
}
return methodSet;
}
private static Map<String, Object> getMethodMap(Class<?> cls) {
Map<String, Object> methodMap = new HashMap<>();
Method[] publicMethods = cls.getDeclaredMethods();
for (Method m : publicMethods) {
if (Modifier.isPublic(m.getModifiers()) || Modifier.isProtected(m.getModifiers())) {
// Return type
Class<?> returnType = m.getReturnType();
// Method parameter
Class[] paramTypes = m.getParameterTypes();
Object[] methodObj = new Object[] { returnType, paramTypes };
methodMap.put(m.getName(), methodObj);
}
}
methodMap.put("className", cls.getSimpleName());
return methodMap;
}
private static Class<?> getSourceClass(String className) {
Class<?> cls = null;
try {
cls = Class.forName(className);
} catch (ClassNotFoundException e) {
exitProcess(e);
}
return cls;
}
private static void exitProcess(Exception e) {
e.printStackTrace();
System.exit(-1);
}
private static boolean notExists(Path path) {
return !exists(path);
}
private static boolean exists(Path path) {
return path.toFile().exists();
}
}

Java自动生成testcase的更多相关文章

  1. JAVA自动生成正则表达式工具类

    经过很久的努力,终于完成了JAVA自动生成正则表达式工具类.还记得之前需要正则,老是从网上找吗?找了想修改也不会修改.现在不用再为此烦恼了,使用此生成类轻松搞定所有正则表达式.赶快在同事面前炫一下吧. ...

  2. Mybatis上路_06-使用Java自动生成[转]

    Mybatis上路_06-使用Java自动生成 11人收藏此文章, 我要收藏发表于1个月前(2013-04-24 23:05) , 已有151次阅读 ,共0个评论 目录:[ - ] 1.编写Gener ...

  3. Mybatis上路_06-使用Java自动生成

    目录[-] 1.编写Generator执行配置文件: 2.在MyEclipse中建空web项目: 3.编写并执行Java程序: 4.查看并修改生成的文件: 5.测试,使用生成的文件查询: 1)导入My ...

  4. java自动生成entity文件

    网上关于自动生成entity文件的代码很多,看了很多代码后,在先辈们的基础上再完善一些功能(指定多个表,全部表). 为了使用方便所以把两个类写在一个java文件中,所以大家可以直接拿这个java文件, ...

  5. java自动生成代码

    看到这个标题,如果你以为真的可以完全自动生成,那你就太Naive啦 我这里想介绍的是,利用模板生成我们需要的代码 一.模板 首先来说说模板,常见的java模板有:FreeMarker.Velocity ...

  6. java自动生成表单简单实例

    数据库表设置 tb_form(form表单) 字段 类型 约束 说明 Id Int 主键 主键 Formid Varchar2(20) 唯一 Form表单id的值 Action Varchar2(20 ...

  7. java 自动生成四则运算式

    本篇文章将要介绍一个“自动生成四则运算式”的java程序,在没有阅读<构建之法>之前,我已经通过一个类的形式实现了要求的功能,但是当阅读完成<构建之法>之后,我意识到自己所写程 ...

  8. JAVA 自动生成对应数据库表的JPA代码工具

    http://blog.csdn.net/zheng2008hua/article/details/6274659 关键词:JPA 数据库表代码自动生成,JPA代码生成     自动生成对应数据库表的 ...

  9. Java自动生成asmx的webservice代码

    第一种方式:针对CXF自动生成的代码对响应类大小写区别问题,可以使用此方法. 工具为Eclipse. 新建Web Service Client. 输入地址点击finish即可自动生成. 调用方式: p ...

随机推荐

  1. POJ3889Fractal Streets

    Fractal Streets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 445   Accepted: 162 Des ...

  2. UE4碰撞规则详解

    UE4的碰撞设置在官方的文档的 物理模拟模块(链接:点击打开链接).但是操作起来感觉坑还是比较多,所以这里总结一下,以防平时经常会漏掉或忽略某些条件.如果想看关于碰撞响应触发,可以参考链接( UE4蓝 ...

  3. 【风马一族_php】NO5_php基础知识_数组

    原文来自:http://www.cnblogs.com/sows/p/6032570.html (博客园的)风马一族 侵犯版本,后果自负 回顾 匿名函数 定义: 变量 = function [参数列表 ...

  4. 【转载】【软件安装】Source Insight 4.0常用设置

    1.Source Insight简介 Source Insight是一个面向软件开发的代码编辑器和浏览器,它拥有内置的对C/C++, C#和Java等源码的分析,创建并动态维护符号数据库,并自动显示有 ...

  5. Android AbsListView子类反复调用getView()和getCount()问题分析

    对于AbsListView子类,假设它的宽高是自适应的,你会发现getView()和getCount()会被疯狂的反复调用.即使在AbsListView子类设置完adapter后,getView()和 ...

  6. poj2987 最大权闭合图

    基础题. 最小割后,与汇点相连的点都不要,然后从源点出发dfs一遍有多少相连的点即可. #include<stdio.h> #include<string.h> #includ ...

  7. com.alibaba.dubbo.remoting.TimeoutException

    maven项目 update clean install 重启 服务消费者

  8. pl/sql基础知识—过程快速入门

    n  过程 过程用于执行特定的操作,当建立过程时,既可以指定输入参数(in),也可以指定输出参数(out),通过在过程中使用输入参数,可以将数据传递到执行部分:通过使用输出参数可以将执行部分的数据传递 ...

  9. Java练习 SDUT-2246_时间日期格式转换

    时间日期格式转换 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于日期的常用格式,在中国常采用格式的是"年 ...

  10. POJ - 1679_The Unique MST

    The Unique MST Time Limit: 1000MS Memory Limit: 10000K Description Given a connected undirected grap ...