From 4f6da20fa48b1b2125be60f6095a16789ceb0705 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=91=E6=88=9F?= Date: Thu, 22 Oct 2020 23:41:34 +0800 Subject: [PATCH] targetClass parameter use class type instead of string --- .../alibaba/testable/demo/DemoServiceTest.java | 6 +++--- .../com/alibaba/testable/demo/DemoServiceTest.kt | 6 +++--- .../transformer/TestableClassTransformer.java | 8 +++++++- .../alibaba/testable/agent/util/ClassUtil.java | 16 +++++++++++++++- .../testable/core/annotation/TestableInject.java | 2 +- 5 files changed, 29 insertions(+), 9 deletions(-) diff --git a/demo/java-demo/src/test/java/com/alibaba/testable/demo/DemoServiceTest.java b/demo/java-demo/src/test/java/com/alibaba/testable/demo/DemoServiceTest.java index 02d755e..ee604e0 100644 --- a/demo/java-demo/src/test/java/com/alibaba/testable/demo/DemoServiceTest.java +++ b/demo/java-demo/src/test/java/com/alibaba/testable/demo/DemoServiceTest.java @@ -25,17 +25,17 @@ class DemoServiceTest { return "mock_" + text; } - @TestableInject(targetClass="java.lang.String") + @TestableInject(targetClass = String.class) private String trim(String self) { return "trim_string"; } - @TestableInject(targetClass="java.lang.String", targetMethod = "substring") + @TestableInject(targetClass = String.class, targetMethod = "substring") private String sub(String self, int i, int j) { return "sub_string"; } - @TestableInject(targetClass="java.lang.String") + @TestableInject(targetClass = String.class) private boolean startsWith(String self, String s) { return false; } diff --git a/demo/kotlin-demo/src/test/kotlin/com/alibaba/testable/demo/DemoServiceTest.kt b/demo/kotlin-demo/src/test/kotlin/com/alibaba/testable/demo/DemoServiceTest.kt index 854f2fb..71b1a25 100644 --- a/demo/kotlin-demo/src/test/kotlin/com/alibaba/testable/demo/DemoServiceTest.kt +++ b/demo/kotlin-demo/src/test/kotlin/com/alibaba/testable/demo/DemoServiceTest.kt @@ -19,13 +19,13 @@ internal class DemoServiceTest { @TestableInject private fun innerFunc(text: String) = "mock_$text" - @TestableInject(targetClass = "com.alibaba.testable.demo.BlackBox") + @TestableInject(targetClass = BlackBox::class) private fun trim(self: BlackBox) = "trim_string" - @TestableInject(targetClass = "com.alibaba.testable.demo.BlackBox", targetMethod = "substring") + @TestableInject(targetClass = BlackBox::class, targetMethod = "substring") private fun sub(self: BlackBox, i: Int, j: Int) = "sub_string" - @TestableInject(targetClass = "com.alibaba.testable.demo.BlackBox") + @TestableInject(targetClass = BlackBox::class) private fun startsWith(self: BlackBox, s: String) = false @TestableInject diff --git a/testable-agent/src/main/java/com/alibaba/testable/agent/transformer/TestableClassTransformer.java b/testable-agent/src/main/java/com/alibaba/testable/agent/transformer/TestableClassTransformer.java index 1483dfb..96842bd 100644 --- a/testable-agent/src/main/java/com/alibaba/testable/agent/transformer/TestableClassTransformer.java +++ b/testable-agent/src/main/java/com/alibaba/testable/agent/transformer/TestableClassTransformer.java @@ -7,6 +7,7 @@ import com.alibaba.testable.agent.model.ImmutablePair; import com.alibaba.testable.agent.model.MethodInfo; import com.alibaba.testable.agent.util.ClassUtil; import org.objectweb.asm.ClassReader; +import org.objectweb.asm.Type; import org.objectweb.asm.tree.AnnotationNode; import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.MethodNode; @@ -112,7 +113,12 @@ public class TestableClassTransformer implements ClassFileTransformer { if (an.values != null) { int i = an.values.indexOf(key); if (i % 2 == 0) { - return (String)an.values.get(i+1); + Object value = an.values.get(i + 1); + if (value instanceof Type) { + // fit for `targetClass` parameter + return ClassUtil.toSlashSeparateFullClassName(value.toString()); + } + return value.toString(); } } return defaultValue; diff --git a/testable-agent/src/main/java/com/alibaba/testable/agent/util/ClassUtil.java b/testable-agent/src/main/java/com/alibaba/testable/agent/util/ClassUtil.java index cf3e3eb..e339182 100644 --- a/testable-agent/src/main/java/com/alibaba/testable/agent/util/ClassUtil.java +++ b/testable-agent/src/main/java/com/alibaba/testable/agent/util/ClassUtil.java @@ -117,6 +117,13 @@ public class ClassUtil { } } + /** + * convert slash separated name to dot separated name + */ + public static String toDotSeparatedName(String name) { + return name.replace(ConstPool.SLASH, ConstPool.DOT); + } + /** * convert dot separated name to slash separated name */ @@ -135,7 +142,14 @@ public class ClassUtil { * convert byte code class name to dot separated human readable name */ public static String toDotSeparateFullClassName(String className) { - return className.replace(ConstPool.SLASH, ConstPool.DOT).substring(1, className.length() - 1); + return toDotSeparatedName(className).substring(1, className.length() - 1); + } + + /** + * convert byte code class name to slash separated human readable name + */ + public static String toSlashSeparateFullClassName(String className) { + return toSlashSeparatedName(className).substring(1, className.length() - 1); } private static boolean isPrimaryType(byte b) { diff --git a/testable-core/src/main/java/com/alibaba/testable/core/annotation/TestableInject.java b/testable-core/src/main/java/com/alibaba/testable/core/annotation/TestableInject.java index ae127b0..0316dd7 100644 --- a/testable-core/src/main/java/com/alibaba/testable/core/annotation/TestableInject.java +++ b/testable-core/src/main/java/com/alibaba/testable/core/annotation/TestableInject.java @@ -15,7 +15,7 @@ public @interface TestableInject { /** * mock method of specified class instead of the class under test */ - String targetClass() default ""; + Class targetClass() default Object.class; /** * mock specified method instead of method with same name