From 990f407ebe22ca6ed587fcaf3e91b61e59c46438 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=91=E6=88=9F?= Date: Tue, 2 Nov 2021 23:09:57 +0800 Subject: [PATCH] should throw NullPointerException when invoke mock method on null object (issue-163) --- .../testable/agent/handler/SourceClassHandler.java | 2 +- .../alibaba/testable/core/tool/PrivateAccessor.java | 4 ++-- .../testable/core/util/MockAssociationUtil.java | 10 +++++++++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/testable-agent/src/main/java/com/alibaba/testable/agent/handler/SourceClassHandler.java b/testable-agent/src/main/java/com/alibaba/testable/agent/handler/SourceClassHandler.java index 7a3951c..718a6df 100644 --- a/testable-agent/src/main/java/com/alibaba/testable/agent/handler/SourceClassHandler.java +++ b/testable-agent/src/main/java/com/alibaba/testable/agent/handler/SourceClassHandler.java @@ -139,7 +139,7 @@ public class SourceClassHandler extends BaseClassHandler { for (MethodInfo m : memberInjectMethods) { String nodeOwner = ClassUtil.fitCompanionClassName(node.owner); String nodeName = ClassUtil.fitKotlinAccessorName(node.name); - // Kotlin accessor method will append a extra type parameter + // Kotlin accessor method will append an extra type parameter String nodeDesc = nodeName.equals(node.name) ? node.desc : MethodUtil.removeFirstParameter(node.desc); if (m.getClazz().equals(nodeOwner) && m.getName().equals(nodeName) && m.getDesc().equals(nodeDesc)) { return m; diff --git a/testable-core/src/main/java/com/alibaba/testable/core/tool/PrivateAccessor.java b/testable-core/src/main/java/com/alibaba/testable/core/tool/PrivateAccessor.java index 1e08c56..0fdb862 100644 --- a/testable-core/src/main/java/com/alibaba/testable/core/tool/PrivateAccessor.java +++ b/testable-core/src/main/java/com/alibaba/testable/core/tool/PrivateAccessor.java @@ -189,13 +189,13 @@ public class PrivateAccessor { } catch (IllegalAccessException e) { throw new MemberAccessException("Failed to access private method \"" + method + "\"", e); } catch (NoSuchFieldException e) { - throw new MemberAccessException("Private method \"" + method + "\" not exist"); + throw new MemberAccessException("Private method \"" + method + "\" not exist", e); } catch (InvocationTargetException e) { if (e.getTargetException() instanceof RuntimeException) { throw (RuntimeException)e.getTargetException(); } throw new MemberAccessException("Invoke private method \"" + method + "\" failed with exception", e); } - throw new MemberAccessException("Private method \"" + method + "\" not exist"); + throw new MemberAccessException("Private method \"" + method + "\" not found"); } } diff --git a/testable-core/src/main/java/com/alibaba/testable/core/util/MockAssociationUtil.java b/testable-core/src/main/java/com/alibaba/testable/core/util/MockAssociationUtil.java index 8f9d6ab..97c9073 100644 --- a/testable-core/src/main/java/com/alibaba/testable/core/util/MockAssociationUtil.java +++ b/testable-core/src/main/java/com/alibaba/testable/core/util/MockAssociationUtil.java @@ -1,5 +1,6 @@ package com.alibaba.testable.core.util; +import com.alibaba.testable.core.exception.MemberAccessException; import com.alibaba.testable.core.model.MockContext; import java.util.HashSet; @@ -69,7 +70,14 @@ public class MockAssociationUtil { if (originMethod.equals(CONSTRUCTOR)) { return construct(originClass, args); } else if (args[0] == null) { - return invokeStatic(originClass, originMethod, CollectionUtil.slice(args, 1)); + try { + return invokeStatic(originClass, originMethod, CollectionUtil.slice(args, 1)); + } catch (RuntimeException e) { + if (e instanceof MemberAccessException && e.getCause() instanceof NoSuchFieldException) { + throw new NullPointerException("Invoking method \"" + originMethod + "\" of null object"); + } + throw e; + } } else { return invoke(args[0], originMethod, CollectionUtil.slice(args, 1)); }