Java自动生成testcase
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的更多相关文章
- JAVA自动生成正则表达式工具类
经过很久的努力,终于完成了JAVA自动生成正则表达式工具类.还记得之前需要正则,老是从网上找吗?找了想修改也不会修改.现在不用再为此烦恼了,使用此生成类轻松搞定所有正则表达式.赶快在同事面前炫一下吧. ...
- Mybatis上路_06-使用Java自动生成[转]
Mybatis上路_06-使用Java自动生成 11人收藏此文章, 我要收藏发表于1个月前(2013-04-24 23:05) , 已有151次阅读 ,共0个评论 目录:[ - ] 1.编写Gener ...
- Mybatis上路_06-使用Java自动生成
目录[-] 1.编写Generator执行配置文件: 2.在MyEclipse中建空web项目: 3.编写并执行Java程序: 4.查看并修改生成的文件: 5.测试,使用生成的文件查询: 1)导入My ...
- java自动生成entity文件
网上关于自动生成entity文件的代码很多,看了很多代码后,在先辈们的基础上再完善一些功能(指定多个表,全部表). 为了使用方便所以把两个类写在一个java文件中,所以大家可以直接拿这个java文件, ...
- java自动生成代码
看到这个标题,如果你以为真的可以完全自动生成,那你就太Naive啦 我这里想介绍的是,利用模板生成我们需要的代码 一.模板 首先来说说模板,常见的java模板有:FreeMarker.Velocity ...
- java自动生成表单简单实例
数据库表设置 tb_form(form表单) 字段 类型 约束 说明 Id Int 主键 主键 Formid Varchar2(20) 唯一 Form表单id的值 Action Varchar2(20 ...
- java 自动生成四则运算式
本篇文章将要介绍一个“自动生成四则运算式”的java程序,在没有阅读<构建之法>之前,我已经通过一个类的形式实现了要求的功能,但是当阅读完成<构建之法>之后,我意识到自己所写程 ...
- JAVA 自动生成对应数据库表的JPA代码工具
http://blog.csdn.net/zheng2008hua/article/details/6274659 关键词:JPA 数据库表代码自动生成,JPA代码生成 自动生成对应数据库表的 ...
- Java自动生成asmx的webservice代码
第一种方式:针对CXF自动生成的代码对响应类大小写区别问题,可以使用此方法. 工具为Eclipse. 新建Web Service Client. 输入地址点击finish即可自动生成. 调用方式: p ...
随机推荐
- 支付宝 python alipay 集成(转)
即时到帐只是支付宝众多商家服务中的一个,表示客户付款,客户用支付宝付款,支付宝收到款项后,马上通知你,并且此笔款项与交易脱离关系,商家可以马上使用. 即时到帐只对企业客户服务,注册成功企业账号以后,申 ...
- CSS:命名规范心得分享
一个好的命名习惯(当然这里指的并不仅仅是CSS命名).不仅可以提高开发效率,而且有益于后期修改和维护. 假设我们当前使用的命名方式都是约定成俗的,所有人都是这样写,那么你去到一个新团队,或者别人来接手 ...
- windows,linux,cmd查看公网/外网IP
1.linux(centos)查看公网/外网ip: curl ifconfig.me #inconfig.me是一个网站来的#或者,如果上面的无法访问curl icanhazip.com 2.Wi ...
- Directx教程(23) 简单的光照模型(2)
原文:Directx教程(23) 简单的光照模型(2) 在工程myTutorialD3D11_16中,我在文件light.vs中定义了一个材质光源属性常量缓冲. //const buffer最好 ...
- left join table_a on ...like...
- hdu4313 贪心+并查集
题意简单思路也还可以.开始从小到大排序非常烦.后来从大到小就很简单了: 从大到小解决了删除的边最小. #include<stdio.h> #include<string.h> ...
- iOS 万能跳转界面方法 (runtime实用篇一)
http://www.cocoachina.com/ios/20150824/13104.html 作者:汉斯哈哈哈 授权本站转载. 在开发项目中,会有这样变态的需求: 推送:根据服务端推送过来的数据 ...
- python 局部变量
- Tcp之双向通信
TestServer.java package com.sxt.tcp; /* * 服务端 */ import java.io.DataInputStream; import java.io.Data ...
- Python基础:04映射类型
字典是Python语言中唯一的映射类型.一个字典对象是可变的,它是一个容器类型,能存储任意个数的Python对象.字典中的数据是无序排列的. 映射类型也可被称做哈希表,哈希表的算法是获取键,对键执行一 ...