diff --git a/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoInherit.java b/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoInherit.java index 2ee375f..da409d9 100644 --- a/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoInherit.java +++ b/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoInherit.java @@ -5,7 +5,8 @@ import com.alibaba.testable.demo.model.Box; import com.alibaba.testable.demo.model.Color; /** - * @author flin + * 演示父类变量引用子类对象时的Mock场景 + * Demonstrate scenario of mocking method from sub-type object referred by parent-type variable */ public class DemoInherit { diff --git a/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoMatcher.java b/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoMatcher.java index 2d6419f..25e39c7 100644 --- a/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoMatcher.java +++ b/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoMatcher.java @@ -9,7 +9,8 @@ import java.util.HashSet; import java.util.List; /** - * @author flin + * 演示Mock方法调用校验器 + * Demonstrate mock method invocation verifier */ public class DemoMatcher { diff --git a/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoMock.java b/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoMock.java index c1ee323..45d41e7 100644 --- a/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoMock.java +++ b/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoMock.java @@ -6,6 +6,10 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.util.stream.Collectors; +/** + * 演示基本的Mock功能 + * Demonstrate basic mock functionality + */ public class DemoMock { /** @@ -20,7 +24,7 @@ public class DemoMock { * method with member method invoke */ public String outerFunc(String s) throws Exception { - return "{ \"res\": \"" + innerFunc(s) + "\"}"; + return "{ \"res\": \"" + innerFunc(s) + staticFunc() + "\"}"; } /** @@ -48,6 +52,10 @@ public class DemoMock { return callFromDifferentMethod(); } + private static String staticFunc() { + return "_STATIC_TAIL"; + } + private String innerFunc(String s) throws Exception { return Files.readAllLines(Paths.get("/a-not-exist-file")).stream().collect(Collectors.joining()); } 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 ebd0fa1..4e0f8c0 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 @@ -1,7 +1,8 @@ package com.alibaba.testable.demo; /** - * @author flin + * 演示私有成员访问功能 + * Demonstrate private member access functionality */ public class DemoPrivateAccess { diff --git a/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoTemplate.java b/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoTemplate.java index d2e52ad..e7fd7e8 100644 --- a/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoTemplate.java +++ b/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoTemplate.java @@ -2,6 +2,10 @@ package com.alibaba.testable.demo; import java.util.*; +/** + * 演示模板方法的Mock场景 + * Demonstrate scenario of mocking template method + */ public class DemoTemplate { private List getList(T value) { diff --git a/demo/java-demo/src/test/java/com/alibaba/testable/demo/DemoMockTest.java b/demo/java-demo/src/test/java/com/alibaba/testable/demo/DemoMockTest.java index 10d9c4c..8989f11 100644 --- a/demo/java-demo/src/test/java/com/alibaba/testable/demo/DemoMockTest.java +++ b/demo/java-demo/src/test/java/com/alibaba/testable/demo/DemoMockTest.java @@ -30,6 +30,11 @@ class DemoMockTest { return "mock_" + text; } + @MockMethod + private String staticFunc(DemoMock self) { + return "_MOCK_TAIL"; + } + @MockMethod private String trim(String self) { return "trim_string"; @@ -70,7 +75,7 @@ class DemoMockTest { @Test void should_able_to_mock_member_method() throws Exception { - assertEquals("{ \"res\": \"mock_hello\"}", demoMock.outerFunc("hello")); + assertEquals("{ \"res\": \"mock_hello_MOCK_TAIL\"}", demoMock.outerFunc("hello")); verify("innerFunc").with("hello"); } diff --git a/demo/java-demo/src/test/java/com/alibaba/testable/demo/DemoTemplateTest.java b/demo/java-demo/src/test/java/com/alibaba/testable/demo/DemoTemplateTest.java index 68165e2..6e2323e 100644 --- a/demo/java-demo/src/test/java/com/alibaba/testable/demo/DemoTemplateTest.java +++ b/demo/java-demo/src/test/java/com/alibaba/testable/demo/DemoTemplateTest.java @@ -9,8 +9,8 @@ import java.util.*; import static org.junit.jupiter.api.Assertions.assertEquals; /** - * 演示模板方法可以被Mock - * Demonstrate template method can be mocked + * 演示模板方法的Mock场景 + * Demonstrate scenario of mocking template method */ class DemoTemplateTest { 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 8845f55..8702da4 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 @@ -122,6 +122,9 @@ public class SourceClassHandler extends BaseClassHandler { private int getMemberMethodStart(AbstractInsnNode[] instructions, int rangeEnd) { int stackLevel = getInitialStackLevel((MethodInsnNode)instructions[rangeEnd]); + if (stackLevel < 0) { + return rangeEnd; + } for (int i = rangeEnd - 1; i >= 0; i--) { stackLevel += getStackLevelChange(instructions[i]); if (stackLevel < 0) {