Skip to content

Commit 5af1f48

Browse files
authored
Fix static mocking (#1142)
1 parent 0cbd535 commit 5af1f48

File tree

4 files changed

+26
-15
lines changed

4 files changed

+26
-15
lines changed

utbot-framework/src/main/kotlin/org/utbot/framework/concrete/InstrumentationContext.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package org.utbot.framework.concrete
22

3-
import org.utbot.framework.plugin.api.util.signature
43
import java.lang.reflect.Method
54
import java.util.IdentityHashMap
5+
import org.utbot.instrumentation.instrumentation.mock.computeKeyForMethod
66

77
/**
88
* Some information, which is computed after classes instrumentation.
@@ -66,7 +66,7 @@ class InstrumentationContext {
6666
}
6767

6868
fun updateMocks(obj: Any?, method: Method, values: List<*>) {
69-
updateMocks(obj, method.signature, values)
69+
updateMocks(obj, computeKeyForMethod(method), values)
7070
}
7171
}
7272
}

utbot-framework/src/main/kotlin/org/utbot/framework/concrete/MethodMockController.kt

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package org.utbot.framework.concrete
22

3-
import org.utbot.common.withAccessibility
4-
import org.utbot.framework.plugin.api.util.signature
5-
import org.utbot.instrumentation.instrumentation.mock.MockConfig
63
import java.lang.reflect.Field
74
import java.lang.reflect.Method
85
import java.lang.reflect.Modifier
6+
import org.utbot.common.withAccessibility
7+
import org.utbot.instrumentation.instrumentation.mock.MockConfig
8+
import org.utbot.instrumentation.instrumentation.mock.computeKeyForMethod
99

1010

1111
/**
@@ -31,7 +31,8 @@ class MethodMockController(
3131
error("$method is an instance method, but instance is null!")
3232
}
3333

34-
val id = instrumentationContext.methodSignatureToId[method.signature]
34+
val computedSignature = computeKeyForMethod(method)
35+
val id = instrumentationContext.methodSignatureToId[computedSignature]
3536

3637
isMockField = clazz.declaredFields.firstOrNull { it.name == MockConfig.IS_MOCK_FIELD + id }
3738
?: error("No field ${MockConfig.IS_MOCK_FIELD + id} in $clazz")

utbot-instrumentation/src/main/kotlin/org/utbot/instrumentation/instrumentation/mock/MockClassVisitor.kt

+11-1
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,21 @@ import org.objectweb.asm.Opcodes
1010
import org.objectweb.asm.Type
1111
import org.objectweb.asm.commons.AdviceAdapter
1212
import org.objectweb.asm.commons.Method.getMethod
13+
import org.utbot.framework.plugin.api.util.signature
1314

1415
object MockConfig {
1516
const val IS_MOCK_FIELD = "\$__is_mock_"
1617
}
1718

19+
/**
20+
* Computes key for method that is used for mocking.
21+
*/
22+
fun computeKeyForMethod(internalType: String, methodSignature: String) =
23+
"$internalType@$methodSignature"
24+
25+
fun computeKeyForMethod(method: Method) =
26+
computeKeyForMethod(Type.getInternalName(method.declaringClass), method.signature)
27+
1828
class MockClassVisitor(
1929
classVisitor: ClassVisitor,
2030
mockGetter: Method,
@@ -73,7 +83,7 @@ class MockClassVisitor(
7383
val isStatic = access and Opcodes.ACC_STATIC != 0
7484
val isVoidMethod = Type.getReturnType(descriptor) == Type.VOID_TYPE
7585

76-
val computedSignature = name + descriptor
86+
val computedSignature = computeKeyForMethod(internalClassName, "$name$descriptor")
7787
val id = signatureToId.size
7888
signatureToId[computedSignature] = id
7989

utbot-instrumentation/src/test/kotlin/org/utbot/instrumentation/examples/mock/MockHelper.kt

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package org.utbot.instrumentation.examples.mock
22

3-
import org.utbot.common.withAccessibility
4-
import org.utbot.framework.plugin.api.util.signature
5-
import org.utbot.instrumentation.instrumentation.instrumenter.Instrumenter
6-
import org.utbot.instrumentation.instrumentation.mock.MockClassVisitor
7-
import org.utbot.instrumentation.instrumentation.mock.MockConfig
83
import java.lang.reflect.Method
94
import java.util.IdentityHashMap
105
import kotlin.reflect.jvm.javaMethod
116
import org.objectweb.asm.Type
7+
import org.utbot.common.withAccessibility
8+
import org.utbot.instrumentation.instrumentation.instrumenter.Instrumenter
9+
import org.utbot.instrumentation.instrumentation.mock.MockClassVisitor
10+
import org.utbot.instrumentation.instrumentation.mock.MockConfig
11+
import org.utbot.instrumentation.instrumentation.mock.computeKeyForMethod
1212

1313
/**
1414
* Helper for generating tests with methods mocks.
@@ -52,8 +52,8 @@ class MockHelper(
5252
error("Can't mock function returning void!")
5353
}
5454

55-
val sign = method.signature
56-
val methodId = mockClassVisitor.signatureToId[sign]
55+
val computedSignature = computeKeyForMethod(method)
56+
val methodId = mockClassVisitor.signatureToId[computedSignature]
5757

5858
val isMockField = instrumentedClazz.getDeclaredField(MockConfig.IS_MOCK_FIELD + methodId)
5959
MockGetter.updateMocks(instance, method, mockedValues)
@@ -129,7 +129,7 @@ class MockHelper(
129129
}
130130

131131
fun updateMocks(obj: Any?, method: Method, values: List<*>) {
132-
updateMocks(obj, method.signature, values)
132+
updateMocks(obj, computeKeyForMethod(method), values)
133133
}
134134
}
135135
}

0 commit comments

Comments
 (0)