diff --git a/testable-core/src/main/java/com/alibaba/testable/core/util/ConstructionUtil.java b/testable-core/src/main/java/com/alibaba/testable/core/util/ConstructionUtil.java index 7d049b4..7624fdb 100644 --- a/testable-core/src/main/java/com/alibaba/testable/core/util/ConstructionUtil.java +++ b/testable-core/src/main/java/com/alibaba/testable/core/util/ConstructionUtil.java @@ -18,31 +18,16 @@ public class ConstructionUtil { public static T generateSubClassOf(Class clazz) throws InstantiationException { StringBuilder sourceCode = new StringBuilder(); sourceCode.append("package ").append(clazz.getPackage().getName()).append(";\n") - .append("public class ").append(getSubclassName(clazz)) - .append(clazz.isInterface() ? " implements " : " extends ") - .append(getClassName(clazz)) - .append(" {\n"); + .append("public class ").append(getSubclassName(clazz)); + appendTypeParameters(sourceCode, clazz.getTypeParameters(), true); + sourceCode.append(clazz.isInterface() ? " implements " : " extends ") + .append(getClassName(clazz)); + appendTypeParameters(sourceCode, clazz.getTypeParameters(), false); + sourceCode.append(" {\n"); for (Method m : clazz.getMethods()) { if (!Modifier.isStatic(m.getModifiers()) && !Modifier.isFinal(m.getModifiers())) { sourceCode.append("\tpublic "); - TypeVariable[] typeParameters = m.getTypeParameters(); - if (typeParameters.length > 0) { - sourceCode.append("<"); - for (int i = 0; i < typeParameters.length; i++) { - sourceCode.append(typeParameters[i].getName()).append(" extends "); - Type[] bounds = typeParameters[i].getBounds(); - for (int j = 0; j < bounds.length; j++) { - sourceCode.append(getClassName(bounds[j])); - if (j < bounds.length - 1) { - sourceCode.append(" & "); - } - } - if (i < typeParameters.length - 1) { - sourceCode.append(", "); - } - } - sourceCode.append("> "); - } + appendTypeParameters(sourceCode, m.getTypeParameters(), true); sourceCode.append(getClassName(m.getGenericReturnType())).append(" ") .append(m.getName()).append("("); Type[] parameters = m.getGenericParameterTypes(); @@ -75,6 +60,29 @@ public class ConstructionUtil { } } + private static void appendTypeParameters(StringBuilder sourceCode, TypeVariable[] typeParameters, boolean withScope) { + if (typeParameters.length > 0) { + sourceCode.append("<"); + for (int i = 0; i < typeParameters.length; i++) { + sourceCode.append(typeParameters[i].getName()); + if (withScope) { + sourceCode.append(" extends "); + Type[] bounds = typeParameters[i].getBounds(); + for (int j = 0; j < bounds.length; j++) { + sourceCode.append(getClassName(bounds[j])); + if (j < bounds.length - 1) { + sourceCode.append(" & "); + } + } + } + if (i < typeParameters.length - 1) { + sourceCode.append(", "); + } + } + sourceCode.append("> "); + } + } + private static String getClassName(Type clazz) { if (clazz instanceof Class) { return ((Class)clazz).getName().replace(DOLLAR, DOT); diff --git a/testable-core/src/test/java/com/alibaba/testable/core/util/ConstructionUtilTest.java b/testable-core/src/test/java/com/alibaba/testable/core/util/ConstructionUtilTest.java index 8198527..de9ee30 100644 --- a/testable-core/src/test/java/com/alibaba/testable/core/util/ConstructionUtilTest.java +++ b/testable-core/src/test/java/com/alibaba/testable/core/util/ConstructionUtilTest.java @@ -36,15 +36,15 @@ class ConstructionUtilTest { public static abstract class AbstractClazz implements RealInterface { @Override public void noParameterMethod() {} - public abstract T getById(T id); + public abstract T getByName(T name); public abstract String getByTags(List tags); public static T useless() { return null; } } - public static abstract class ParameterizedClazz extends AbstractClazz implements RealInterface, EmptyInterface { - public abstract int getById(T id); - public abstract int getByIds(List id); - public abstract int getByMap(Map m); + public static abstract class ParameterizedClazz extends AbstractClazz implements RealInterface, EmptyInterface { + public abstract S getById(S id); + public abstract S getByIds(List ids); + public abstract P getByMap(Map m); } @Test