diff --git a/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoPrivateAccess.java b/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoPrivateAccess.java index bb465de..ebd0fa1 100644 --- a/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoPrivateAccess.java +++ b/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoPrivateAccess.java @@ -18,22 +18,6 @@ public class DemoPrivateAccess { */ public final Double pi = 3.14; - /** - * method accessing private static field - */ - public static String privateStaticFieldAccessFunc() { - staticCount += 3; - return String.valueOf(staticCount); - } - - /** - * method accessing private member field - */ - public String privateFieldAccessFunc() { - count += 2; - return String.valueOf(count); - } - /** * private static method */ diff --git a/demo/java-demo/src/test/java/com/alibaba/testable/demo/DemoPrivateAccessTest.java b/demo/java-demo/src/test/java/com/alibaba/testable/demo/DemoPrivateAccessTest.java index 366c3bb..cafb0f3 100644 --- a/demo/java-demo/src/test/java/com/alibaba/testable/demo/DemoPrivateAccessTest.java +++ b/demo/java-demo/src/test/java/com/alibaba/testable/demo/DemoPrivateAccessTest.java @@ -20,12 +20,10 @@ class DemoPrivateAccessTest { @Test void should_able_to_access_private_field() throws Exception { demoPrivateAccess.count = 2; - assertEquals("4", demoPrivateAccess.privateFieldAccessFunc()); - assertEquals(new Integer(4), demoPrivateAccess.count); + assertEquals(new Integer(2), demoPrivateAccess.count); PrivateAccessor.set(demoPrivateAccess, "count", 3); - assertEquals("5", demoPrivateAccess.privateFieldAccessFunc()); - assertEquals(new Integer(5), PrivateAccessor.get(demoPrivateAccess, "count")); + assertEquals(new Integer(3), PrivateAccessor.get(demoPrivateAccess, "count")); } @Test @@ -37,12 +35,10 @@ class DemoPrivateAccessTest { @Test void should_able_to_access_private_static_field() throws Exception { //DemoPrivateAccess.staticCount = 2; - //assertEquals("5", DemoPrivateAccess.privateStaticFieldAccessFunc()); - //assertEquals(new Integer(5), DemoPrivateAccess.staticCount); + //assertEquals(new Integer(2), DemoPrivateAccess.staticCount); PrivateAccessor.setStatic(DemoPrivateAccess.class, "staticCount", 3); - assertEquals("6", DemoPrivateAccess.privateStaticFieldAccessFunc()); - assertEquals(new Integer(6), PrivateAccessor.getStatic(DemoPrivateAccess.class, "staticCount")); + assertEquals(new Integer(3), PrivateAccessor.getStatic(DemoPrivateAccess.class, "staticCount")); } @Test diff --git a/demo/kotlin-demo/src/main/kotlin/com/alibaba/testable/demo/DemoPrivateAccess.kt b/demo/kotlin-demo/src/main/kotlin/com/alibaba/testable/demo/DemoPrivateAccess.kt index fb1e574..adfe0d5 100644 --- a/demo/kotlin-demo/src/main/kotlin/com/alibaba/testable/demo/DemoPrivateAccess.kt +++ b/demo/kotlin-demo/src/main/kotlin/com/alibaba/testable/demo/DemoPrivateAccess.kt @@ -2,23 +2,43 @@ package com.alibaba.testable.demo class DemoPrivateAccess { + /** + * a private member field + */ private var count = 0 - final val pi = 3.14 + /** + * a constant field + */ + val pi = 3.14 /** - * private method + * private member method */ private fun privateFunc(s: String, i: Int): String { return "$s - $i" } - /** - * method with private field access - */ - fun privateFieldAccessFunc(): String { - count += 2 - return count.toString() + companion object { + + /** + * a private static field + */ + private var staticCount = 0 + + /** + * private static method + */ + private fun privateStaticFunc(s: String, i: Int): String { + return "$s + $i" + } + + /** + * private jvm static method + */ + @JvmStatic private fun privateJvmStaticFunc(s: String, i: Int): String { + return "$s * $i" + } } } diff --git a/demo/kotlin-demo/src/test/kotlin/com/alibaba/testable/demo/DemoPrivateAccessTest.kt b/demo/kotlin-demo/src/test/kotlin/com/alibaba/testable/demo/DemoPrivateAccessTest.kt index 317ffb7..177afcc 100644 --- a/demo/kotlin-demo/src/test/kotlin/com/alibaba/testable/demo/DemoPrivateAccessTest.kt +++ b/demo/kotlin-demo/src/test/kotlin/com/alibaba/testable/demo/DemoPrivateAccessTest.kt @@ -17,8 +17,19 @@ internal class DemoPrivateAccessTest { @Test fun should_able_to_access_private_field() { PrivateAccessor.set(demoPrivateAccess, "count", 3) - assertEquals("5", demoPrivateAccess.privateFieldAccessFunc()) - assertEquals(5, PrivateAccessor.get(demoPrivateAccess, "count")) + assertEquals(3, PrivateAccessor.get(demoPrivateAccess, "count")) + } + + @Test + fun should_able_to_access_private_static_method() { + assertEquals("hello + 1", PrivateAccessor.invokeStatic(DemoPrivateAccess::class.java, "privateStaticFunc", "hello", 1)) + assertEquals("hello * 1", PrivateAccessor.invokeStatic(DemoPrivateAccess::class.java, "privateJvmStaticFunc", "hello", 1)) + } + + @Test + fun should_able_to_access_private_static_field() { + PrivateAccessor.setStatic(DemoPrivateAccess::class.java, "staticCount", 3) + assertEquals(3, PrivateAccessor.getStatic(DemoPrivateAccess::class.java, "staticCount")) } @Test diff --git a/testable-core/src/main/java/com/alibaba/testable/core/accessor/PrivateAccessor.java b/testable-core/src/main/java/com/alibaba/testable/core/accessor/PrivateAccessor.java index e02b3b7..d95e60e 100644 --- a/testable-core/src/main/java/com/alibaba/testable/core/accessor/PrivateAccessor.java +++ b/testable-core/src/main/java/com/alibaba/testable/core/accessor/PrivateAccessor.java @@ -10,6 +10,8 @@ import java.lang.reflect.Method; */ public class PrivateAccessor { + private static final String KOTLIN_COMPANION_FIELD = "Companion"; + public static T get(Object ref, String field) { try { Field declaredField = ref.getClass().getDeclaredField(field); @@ -75,6 +77,15 @@ public class PrivateAccessor { declaredMethod.setAccessible(true); return (T)declaredMethod.invoke(null, args); } + // fit kotlin companion object, will throw 'NoSuchFieldException' otherwise + Field companionClassField = clazz.getDeclaredField(KOTLIN_COMPANION_FIELD); + declaredMethod = TypeUtil.getMethodByNameAndParameterTypes( + companionClassField.getType().getDeclaredMethods(), method, cls); + Object companionInstance = getStatic(clazz, KOTLIN_COMPANION_FIELD); + if (declaredMethod != null && companionInstance != null) { + declaredMethod.setAccessible(true); + return (T)declaredMethod.invoke(companionInstance, args); + } } catch (Exception e) { System.err.println("Failed to invoke private static method \"" + method + "\": " + e.toString()); return null; diff --git a/testable-core/src/main/java/com/alibaba/testable/core/util/TestableUtil.java b/testable-core/src/main/java/com/alibaba/testable/core/util/TestableUtil.java index cf24302..bd4da15 100644 --- a/testable-core/src/main/java/com/alibaba/testable/core/util/TestableUtil.java +++ b/testable-core/src/main/java/com/alibaba/testable/core/util/TestableUtil.java @@ -67,7 +67,6 @@ public class TestableUtil { } } } - System.err.println("testCaseName: " + testCaseName); return testCaseName; }