自动生成测试类,并填充测试数据(一)
一 说明
在日常开发过程中,需要对功能做单元测试,还需要制造测试数据。在测试的过程中,造数是比较蛋疼的事情,并且需要编写大量的set方法。所以就有感制作一个自动生成测试用例的代码。
二 设计思路
内容其实很简单,就是通过固定的字符串拼接
+ 反射机制
来实现功能。其中有几个需要注意的地方是,判断基本数据类型,List,Map,存在泛型的类,这些是否有复杂的嵌套(暂时没有实现多层嵌套,可以作为优化点。)
由于在开发过程中,核心逻辑都在Service
层,所以目前开发了Service
的单元测试生成器。后面再计划添加Controller
层的。
三 上代码
本代码依赖 hutool
的工具包,请自行添加。
1 工具类 GenStrUtil
package com.cah.project.mock.util;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 功能描述: 本项目的字符串工具类,扩展hutool的StrUtil <br/>
*/
public class GenStrUtil extends StrUtil {
/**
* 功能描述: 获取类型简称 <br/>
*
* @param type 类型
* @return "java.lang.String"
*/
public static String getTypeSimpleName(Type type) {
String typeName = type.getTypeName();
// 是否存在泛型,如 List<E>, Map<K,V>等
if(typeName.contains("<")) {
String child = typeName.substring(typeName.indexOf("<") + 1, typeName.indexOf(">"));
String[] children = child.split(",");
typeName = typeName.substring(0, typeName.indexOf("<"));
return typeName.substring(typeName.lastIndexOf(".") + 1) +
"<" + Stream.of(children).map(c -> c.substring(c.lastIndexOf(".") + 1)).collect(Collectors.joining(", ")) + ">";
} else {
return typeName.substring(typeName.lastIndexOf(".") + 1);
}
}
/**
* 功能描述: 获取java类原本引入的包 <br/>
*
* @param projectName 项目模块名称
* @param clazz java类
* @return "java.lang.String"
*/
public static String getClassImport(String projectName, Class<?> clazz) {
File javaFile = new File(getJavaFilePath(projectName, clazz));
try(BufferedReader reader = FileUtil.getUtf8Reader(javaFile)) {
String line;
StringBuilder sb = new StringBuilder();
while ((line = reader.readLine()) != null)