mirror of
https://github.com/alibaba/testable-mock.git
synced 2025-03-10 09:40:30 +08:00
support invoke private companion object method in kotlin
This commit is contained in:
parent
001001bfd3
commit
1d98e3c618
@ -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
|
||||
*/
|
||||
|
@ -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
|
||||
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -10,6 +10,8 @@ import java.lang.reflect.Method;
|
||||
*/
|
||||
public class PrivateAccessor {
|
||||
|
||||
private static final String KOTLIN_COMPANION_FIELD = "Companion";
|
||||
|
||||
public static <T> 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;
|
||||
|
@ -67,7 +67,6 @@ public class TestableUtil {
|
||||
}
|
||||
}
|
||||
}
|
||||
System.err.println("testCaseName: " + testCaseName);
|
||||
return testCaseName;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user