package com.areyoo.lok.controller;
import com.areyoo.lok.vo.TestTwoVo;
import java.lang.reflect.*;
import java.util.HashSet;
import java.util.ArrayList;
import com.alibaba.fastjson.JSON;
import com.areyoo.lok.service.api.WwService;
import com.areyoo.lok.vo.TestVo;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.junit.Assert;
import org.junit.Before;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.math.BigDecimal;
import java.util.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class WwControllerTest {
@InjectMocks
WwController wwController;
@Mock
private WwService wwService;
@Test
void testTest() {
}
@Test
void testIndex() {
when(wwService.index(any())).thenReturn("1hey");
String result = wwController.index("hey");
Assert.assertTrue(result.indexOf("hey") > 0);
}
@Test
void testGetTestVo() throws Exception {
Method method = wwController.getClass().getDeclaredMethod("getTestVo", TestVo.class);
method.setAccessible(true);
Object obj = method.invoke(wwController, new TestVo());
TestVo result = null;
if (obj instanceof TestVo) {
result = (TestVo) obj;
}
Assert.assertTrue(result != null && result.getCost().equals(new BigDecimal("1")));
Gson gson = new Gson();
String json = "{'name':'1','cost':'1','id':'1','f2':'1','count':'1','b':'1','d':'1','set':[],'f':'1','c2':'1','l':'1','i':'1','list':[],'b2':'1','s':'1','s2':'1','d2':'1'}";
TestVo vo = new Gson().fromJson(json, TestVo.class);
List vo2 = new Gson().fromJson("[" + json + "]", new TypeToken>() {}.getType());
}
private String baseName = "wwController";
@Test
void genTest() throws Exception {
genCode(WwController.class);
}
private void genCode(Class myClass) throws Exception {
String name = myClass.getName();
Field[] fields = myClass.getDeclaredFields();
for (Field field : fields) {
System.out.println("class " + field.getName() + " {");
}
methods(myClass.getMethods(), myClass.getDeclaredMethods());
System.out.println("}");
}
private void methods(Method[] publicMethod, Method[] allMethod) throws Exception {
List resultList = new ArrayList<>(publicMethod.length);
Collections.addAll(resultList, publicMethod);
Map map = new HashMap<>();
for (Method method : allMethod) {
Class[] classes = method.getParameterTypes();
Parameter[] parameter = method.getParameters();
List meta = new ArrayList<>();
List metaType = new ArrayList<>();
List parameterType = getMethodParameterTypes(method);
System.out.println("public void " + method.getName() + "Test() throws Exception {");
for (int i = 0; i < classes.length; i++) {
// 取得每个参数的初始化
if (isVo(classes[i])) {
String setLine = parameterType.get(i) + " " + parameter[i].getName() + " = get" +
getType(classes[i].getTypeName()) + "();";
System.out.println(setLine);
map.put(classes[i].getName(), getAttr(classes[i]));
} else {
String setLine = parameterType.get(i) + " " + parameter[i].getName() + " = " +
getDefaultVal(classes[i].getTypeName()) + ";";
System.out.println(setLine);
}
meta.add(parameter[i].getName());
metaType.add(getType(classes[i].getTypeName()) + ".class");
}
if (!resultList.contains(method)) {
String initMethod = "Method method = " + baseName + ".getClass().getDeclaredMethod("" + baseName + "", "
+ String.join(", ", metaType) + ");";
System.out.println(initMethod);
System.out.println("method.invoke(" + baseName + "." + method.getName() + ", " + String.join(", ", meta) + ");");
} else {
System.out.println(baseName + "." + method.getName() + "(" + String.join(", ", meta) + ");");
}
System.out.println("}");
}
for (Map.Entry entry : map.entrySet()) {
String localType = getType(entry.getKey());
String fnStr = "public " + localType + " get" + localType
+ "() {nString json = ""
+ entry.getValue() + "";n" + localType + " vo = new Gson().fromJson(json, " + localType + ".class);nreturn vo;n}";
System.out.println(fnStr);
}
}
private List getMethods(Class myClass, Class myClass2) {
List resultList = new ArrayList<>(myClass2.getMethods().length);
Collections.addAll(resultList, myClass2.getMethods());
List list = new ArrayList<>();
for (Method method : myClass.getMethods()) {
if (!resultList.contains(method)) {
list.add(method);
}
}
return list;
}
private List getMethods(Class myClass) {
return getMethods(myClass, Object.class);
}
private Boolean isVo(Class myClass) {
List listMethod = getMethods(myClass);
for (Method method : listMethod) {
Class[] parameter = method.getParameterTypes();
if (method.getName().length() > 3 && method.getName().substring(0, 3).equals("set") && parameter.length == 1) {
return true;
}
}
return false;
}
private String getAttr(Class myClass) throws Exception {
List result = new ArrayList<>();
result.add("'" + baseName + "':0");
for (Method method : getMethods(myClass)) {
Class[] parameter = method.getParameterTypes();
if (method.getName().length() > 3 && method.getName().substring(0, 3).equals("set") && parameter.length == 1) {
result.add("'" + (method.getName().substring(3, 4).toLowerCase()) + method.getName().substring(4) +
"':" + getDefaultValue(parameter[0].getName()));
}
}
return "{" + String.join(",", result) + "}";
}
public List getMethodParameterTypes(Method method) throws Exception {
Type[] genericParameterTypes = method.getGenericParameterTypes();
Class[] parameter = method.getParameterTypes();
List list = new ArrayList<>();
for (int i = 0; i < genericParameterTypes.length; i++) {
Type genericType = genericParameterTypes[i];
if (genericType instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) genericType;
Type[] types = parameterizedType.getActualTypeArguments();
List tmpList = new ArrayList<>();
for (Type type : types) {
Class realType = (Class) type;
tmpList.add(getType(realType.getName()));
}
list.add(getType(parameter[i].getTypeName()) + "<" + String.join(", ", tmpList) + ">");
} else {
list.add(getType(parameter[i].getTypeName()));
}
}
return list;
}
private String getType(String type) {
String[] arr = type.split("[.]");
if (arr.length > 0) {
return arr[arr.length - 1];
} else {
return "";
}
}
private String getDefaultVal(String name) {
String result = null;
switch (name) {
case "java.math.BigDecimal":
result = "new BigDecimal(1)";
break;
case "java.math.BigInteger":
result = "new BigInteger(1)";
break;
case "short":
result = "(short)0";
break;
case "byte":
result = "(byte)1";
break;
case "char":
result = "'1'";
break;
case "long":
case "java.lang.Long":
result = "1L";
break;
case "int":
case "java.lang.Integer":
result = "1";
break;
case "double":
case "java.lang.Double":
result = "1.0D";
break;
case "float":
case "java.lang.Float":
result = "1.0F";
break;
case "java.lang.String":
result = ""1"";
break;
case "java.lang.Boolean":
case "boolean":
result = "true";
break;
case "java.util.List":
result = "new ArrayList<>()";
break;
case "java.util.Set":
result = "new HashSet<>()";
break;
default:
result = "new " + getType(name) + "()";
}
return result;
}
private String getDefaultValue(String name) {
String result;
switch (name) {
case "java.math.BigDecimal":
case "java.math.BigInteger":
case "long":
case "int":
case "short":
case "double":
case "float":
case "byte":
case "char":
case "java.lang.Long":
case "java.lang.Integer":
case "java.lang.Short":
case "java.lang.Double":
case "java.lang.Float":
case "java.lang.String":
result = "'1'";
break;
case "java.lang.Boolean":
case "boolean":
result = "true";
break;
case "java.util.List":
case "java.util.Set":
result = "[]";
break;
default:
result = "{}";
}
return result;
}
}
这个只是生成UT代码的一部份, 本应该用模板的,但为了快先用着
格式不好看ide 格式化



