fix #248, should not look up package mapping if found mock class

This commit is contained in:
金戟
2021-12-11 14:40:27 +08:00
parent 140e54983b
commit fda7ee23c7

View File

@@ -63,15 +63,14 @@ public class TestableClassTransformer implements ClassFileTransformer {
}
private byte[] transformMock(byte[] bytes, ClassNode cn) {
String className = (GlobalConfig.getMockPackageMapping() == null) ? cn.name : mapPackage(cn.name);
try {
if (mockClassParser.isMockClass(cn)) {
// it's a mock class
bytes = new MockClassHandler(className).getBytes(bytes);
bytes = new MockClassHandler(cn.name).getBytes(bytes);
BytecodeUtil.dumpByte(cn, GlobalConfig.getDumpPath(), bytes);
return bytes;
}
String mockClass = foundMockForSourceClass(className);
String mockClass = foundMockForSourceClass(cn.name);
if (mockClass != null) {
// it's a source class with testable enabled
List<MethodInfo> injectMethods = mockClassParser.getTestableMockMethods(mockClass);
@@ -92,7 +91,7 @@ public class TestableClassTransformer implements ClassFileTransformer {
LogUtil.error("Invalid mock method %s::%s - %s", e.getClassName(), e.getMethodName(), e.getMessage());
System.exit(0);
} catch (Throwable t) {
LogUtil.warn("Failed to transform class " + className);
LogUtil.warn("Failed to transform class " + cn.name);
LogUtil.warn(t.toString());
LogUtil.warn(ThreadUtil.getFirstRelatedStackLine(t));
} finally {
@@ -102,18 +101,8 @@ public class TestableClassTransformer implements ClassFileTransformer {
return bytes;
}
private String mapPackage(String name) {
String dotSeparatedName = ClassUtil.toDotSeparatedName(name);
for (String prefix : GlobalConfig.getMockPackageMapping().keySet()) {
if (dotSeparatedName.startsWith(prefix)) {
return ClassUtil.toSlashSeparatedName(GlobalConfig.getMockPackageMapping().get(prefix))
+ name.substring(prefix.length());
}
}
return name;
}
private String foundMockForSourceClass(String className) {
private String foundMockForSourceClass(String name) {
String className = (GlobalConfig.getMockPackageMapping() == null) ? name : mapPackage(name);
String mockClass = lookForMockWithAnnotationAsSourceClass(className);
if (mockClass != null) {
return mockClass;
@@ -125,6 +114,17 @@ public class TestableClassTransformer implements ClassFileTransformer {
return foundMockForInnerSourceClass(className);
}
private String mapPackage(String name) {
String dotSeparatedName = ClassUtil.toDotSeparatedName(name);
for (String prefix : GlobalConfig.getMockPackageMapping().keySet()) {
if (dotSeparatedName.startsWith(prefix)) {
return ClassUtil.toSlashSeparatedName(GlobalConfig.getMockPackageMapping().get(prefix))
+ name.substring(prefix.length());
}
}
return name;
}
private String foundMockForInnerSourceClass(String className) {
return (className.contains(DOLLAR) && !className.endsWith(KOTLIN_POSTFIX_COMPANION)) ?
foundMockForTestClass(ClassUtil.getTestClassName(className.substring(0, className.indexOf(DOLLAR)))) : null;