diff --git a/README.md b/README.md
index c17109d..1634bb2 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,8 @@
## 目录结构
```bash
-|-- testable-core ➜ 核心组件,提供测试辅助功能、注解和工具类
+|-- testable-core ➜ 核心组件,提供注解和工具类
+|-- testable-processor ➜ 编译期代码预处理组件,提供测试辅助功能
|-- testable-agent ➜ JavaAgent组件,提供Mock测试相关功能
|-- testable-maven-plugin ➜ Maven插件组件,用于简化JavaAgent注入
|-- demo
diff --git a/demo/java-demo/pom.xml b/demo/java-demo/pom.xml
index f4666e4..65d64d5 100644
--- a/demo/java-demo/pom.xml
+++ b/demo/java-demo/pom.xml
@@ -27,7 +27,7 @@
com.alibaba.testable
- testable-core
+ testable-processor
${testable.version}
provided
diff --git a/demo/java-demo/src/main/java/com/alibaba/testable/demo/BlackBox.java b/demo/java-demo/src/main/java/com/alibaba/testable/demo/BlackBox.java
index 9fa953c..025bb15 100644
--- a/demo/java-demo/src/main/java/com/alibaba/testable/demo/BlackBox.java
+++ b/demo/java-demo/src/main/java/com/alibaba/testable/demo/BlackBox.java
@@ -12,4 +12,8 @@ public class BlackBox {
return data;
}
+ public static BlackBox secretBox() {
+ return new BlackBox("secret");
+ }
+
}
diff --git a/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoService.java b/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoService.java
index 467be9c..5b0f593 100644
--- a/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoService.java
+++ b/demo/java-demo/src/main/java/com/alibaba/testable/demo/DemoService.java
@@ -47,6 +47,13 @@ public class DemoService {
return "anything".trim() + "__" + "anything".substring(1, 2) + "__" + "abc".startsWith("ab");
}
+ /**
+ * Target 6 - method with static method invoke
+ */
+ public BlackBox getBox() {
+ return BlackBox.secretBox();
+ }
+
public String callerOne() {
return callFromDifferentMethod();
}
diff --git a/demo/java-demo/src/test/java/com/alibaba/testable/demo/DemoServiceTest.java b/demo/java-demo/src/test/java/com/alibaba/testable/demo/DemoServiceTest.java
index ee4c8f2..8e863c5 100644
--- a/demo/java-demo/src/test/java/com/alibaba/testable/demo/DemoServiceTest.java
+++ b/demo/java-demo/src/test/java/com/alibaba/testable/demo/DemoServiceTest.java
@@ -1,7 +1,7 @@
package com.alibaba.testable.demo;
import com.alibaba.testable.core.accessor.PrivateAccessor;
-import com.alibaba.testable.core.annotation.EnablePrivateAccess;
+import com.alibaba.testable.processor.annotation.EnablePrivateAccess;
import com.alibaba.testable.core.annotation.TestableMock;
import org.junit.jupiter.api.Test;
@@ -38,6 +38,11 @@ class DemoServiceTest {
return false;
}
+ @TestableMock
+ private BlackBox secretBox() {
+ return new BlackBox("not_secret_box");
+ }
+
@TestableMock
private String callFromDifferentMethod(DemoService self) {
if (TEST_CASE.equals("should_able_to_get_test_case_name")) {
@@ -52,13 +57,13 @@ class DemoServiceTest {
private DemoService demoService = new DemoService();
@Test
- void should_able_to_test_private_method() throws Exception {
+ void should_able_to_mock_private_method() throws Exception {
assertEquals("hello - 1", demoService.privateFunc("hello", 1));
assertEquals("hello - 1", PrivateAccessor.invoke(demoService, "privateFunc", "hello", 1));
}
@Test
- void should_able_to_test_private_field() throws Exception {
+ void should_able_to_mock_private_field() throws Exception {
demoService.count = 2;
assertEquals("4", demoService.privateFieldAccessFunc());
PrivateAccessor.set(demoService, "count", 3);
@@ -67,19 +72,19 @@ class DemoServiceTest {
}
@Test
- void should_able_to_test_new_object() throws Exception {
+ void should_able_to_mock_new_object() throws Exception {
assertEquals("mock_something", demoService.newFunc());
verify("createBlackBox").times(1);
}
@Test
- void should_able_to_test_member_method() throws Exception {
+ void should_able_to_mock_member_method() throws Exception {
assertEquals("{ \"res\": \"mock_hello\"}", demoService.outerFunc("hello"));
verify("innerFunc").times(1);
}
@Test
- void should_able_to_test_common_method() throws Exception {
+ void should_able_to_mock_common_method() throws Exception {
assertEquals("trim_string__sub_string__false", demoService.commonFunc());
verify("trim").times(1);
verify("sub").times(1);
diff --git a/demo/kotlin-demo/pom.xml b/demo/kotlin-demo/pom.xml
index d770b22..a2aef76 100644
--- a/demo/kotlin-demo/pom.xml
+++ b/demo/kotlin-demo/pom.xml
@@ -40,7 +40,7 @@
com.alibaba.testable
- testable-core
+ testable-processor
${testable.version}
provided
diff --git a/demo/kotlin-demo/src/main/kotlin/com/alibaba/testable/demo/BlackBox.kt b/demo/kotlin-demo/src/main/kotlin/com/alibaba/testable/demo/BlackBox.kt
index f7b7295..bcf17ea 100644
--- a/demo/kotlin-demo/src/main/kotlin/com/alibaba/testable/demo/BlackBox.kt
+++ b/demo/kotlin-demo/src/main/kotlin/com/alibaba/testable/demo/BlackBox.kt
@@ -19,4 +19,16 @@ class BlackBox(private val data: String) {
return data.startsWith(prefix)
}
+ companion object {
+ fun secretBox(): BlackBox {
+ return BlackBox("secret")
+ }
+ }
+
+}
+
+object ColorBox {
+ fun createBox(color: String): BlackBox {
+ return BlackBox("${color}_Box")
+ }
}
diff --git a/demo/kotlin-demo/src/test/kotlin/com/alibaba/testable/demo/DemoServiceTest.kt b/demo/kotlin-demo/src/test/kotlin/com/alibaba/testable/demo/DemoServiceTest.kt
index 8924af8..f4c29b6 100644
--- a/demo/kotlin-demo/src/test/kotlin/com/alibaba/testable/demo/DemoServiceTest.kt
+++ b/demo/kotlin-demo/src/test/kotlin/com/alibaba/testable/demo/DemoServiceTest.kt
@@ -1,7 +1,7 @@
package com.alibaba.testable.demo
import com.alibaba.testable.core.accessor.PrivateAccessor
-import com.alibaba.testable.core.annotation.EnablePrivateAccess
+import com.alibaba.testable.processor.annotation.EnablePrivateAccess
import com.alibaba.testable.core.annotation.TestableMock
import com.alibaba.testable.core.tool.TestableTool.*
import org.junit.jupiter.api.Assertions.assertEquals
@@ -42,31 +42,31 @@ internal class DemoServiceTest {
private val demoService = DemoService()
@Test
- fun should_able_to_test_private_method() {
+ fun should_able_to_mock_private_method() {
assertEquals("hello - 1", PrivateAccessor.invoke(demoService, "privateFunc", "hello", 1))
}
@Test
- fun should_able_to_test_private_field() {
+ fun should_able_to_mock_private_field() {
PrivateAccessor.set(demoService, "count", 3)
assertEquals("5", demoService.privateFieldAccessFunc())
assertEquals(5, PrivateAccessor.get(demoService, "count"))
}
@Test
- fun should_able_to_test_new_object() {
+ fun should_able_to_mock_new_object() {
assertEquals("mock_something", demoService.newFunc())
verify("createBlackBox").times(1)
}
@Test
- fun should_able_to_test_member_method() {
+ fun should_able_to_mock_member_method() {
assertEquals("{ \"res\": \"mock_hello\"}", demoService.outerFunc("hello"))
verify("innerFunc").times(1)
}
@Test
- fun should_able_to_test_common_method() {
+ fun should_able_to_mock_common_method() {
assertEquals("trim_string__sub_string__false", demoService.commonFunc())
verify("trim").times(1)
verify("sub").times(1)
diff --git a/docs/Usage.md b/docs/Usage.md
index d29d84e..3a3bb8b 100644
--- a/docs/Usage.md
+++ b/docs/Usage.md
@@ -3,12 +3,12 @@
## 引入Testable
-首先在项目`pom.xml`文件中添加`testable-core`依赖:
+首先在项目`pom.xml`文件中添加`testable-processor`依赖:
```xml
com.alibaba.testable
- testable-core
+ testable-processor
${testable.version}
provided
@@ -51,7 +51,7 @@
若不希望看到IDE的语法错误提醒,或是在基于JVM的非Java语言项目里(譬如Kotlin语言),也可以借助`PrivateAccessor`工具类来实现私有成员的访问。
-效果见示例项目文件`DemoServiceTest.java`中的`should_able_to_test_private_method()`和`should_able_to_test_private_field()`测试用例。
+效果见示例项目文件`DemoServiceTest.java`中的`should_able_to_mock_private_method()`和`should_able_to_mock_private_field()`测试用例。
### Mock被测类的任意方法调用
@@ -63,7 +63,7 @@
**注意**:当遇到有两个需覆写的方法重名时,可将需覆写的方法名写到`@TestableMock`注解的`targetMethod`参数里,此时Mock方法自身就可以随意命名了。
-示例项目文件`DemoServiceTest.java`中的`should_able_to_test_common_method()`用例详细展示了这种用法。
+示例项目文件`DemoServiceTest.java`中的`should_able_to_mock_common_method()`用例详细展示了这种用法。
**【2】覆写被测类自身的成员方法**
@@ -71,7 +71,7 @@
操作方法与前一种情况相同,Mock方法的第一个参数类型需与被测类相同,即可实现对被测类自身(不论是公有或私有)成员方法的覆写。
-详见示例项目文件`DemoServiceTest.java`中的`should_able_to_test_member_method()`用例。
+详见示例项目文件`DemoServiceTest.java`中的`should_able_to_mock_member_method()`用例。
**【3】覆写任意类的new操作**
@@ -79,7 +79,7 @@
此时被测类中所有用`new`创建指定类的操作(并使用了与Mock方法参数一致的构造函数)将被替换为对该自定义方法的调用。
-详见示例项目文件`DemoServiceTest.java`中的`should_able_to_test_new_object()`用例。
+详见示例项目文件`DemoServiceTest.java`中的`should_able_to_mock_new_object()`用例。
**【4】识别当前测试用例和调用来源**
diff --git a/pom.xml b/pom.xml
index 75c5c6b..fc1a7e8 100755
--- a/pom.xml
+++ b/pom.xml
@@ -10,6 +10,7 @@
testable-core
+ testable-processor
testable-agent
testable-maven-plugin
demo
diff --git a/testable-agent/pom.xml b/testable-agent/pom.xml
index aa60b46..de8644a 100755
--- a/testable-agent/pom.xml
+++ b/testable-agent/pom.xml
@@ -14,6 +14,7 @@
1.6
UTF-8
8.0.1
+ 5.6.2
0.2.1-SNAPSHOT
3.8.1
3.2.0
@@ -29,7 +30,7 @@
org.junit.jupiter
junit-jupiter-api
- 5.6.2
+ ${junit.version}
test
diff --git a/testable-core/pom.xml b/testable-core/pom.xml
index 527caeb..f45a3b8 100644
--- a/testable-core/pom.xml
+++ b/testable-core/pom.xml
@@ -15,20 +15,14 @@
1.6
UTF-8
3.8.1
+ 5.6.2
-
- sun.jdk
- tools
- ${java.version}
- system
- ${java.home}/../lib/tools.jar
-
org.junit.jupiter
junit-jupiter-api
- 5.6.2
+ ${junit.version}
test
@@ -43,7 +37,6 @@
${project.compiler.level}
${project.compiler.level}
${project.build.sourceEncoding}
- -proc:none
diff --git a/testable-core/src/main/java/com/alibaba/testable/core/annotation/TestableMock.java b/testable-core/src/main/java/com/alibaba/testable/core/annotation/TestableMock.java
index 75ded6a..c482c9c 100644
--- a/testable-core/src/main/java/com/alibaba/testable/core/annotation/TestableMock.java
+++ b/testable-core/src/main/java/com/alibaba/testable/core/annotation/TestableMock.java
@@ -1,5 +1,7 @@
package com.alibaba.testable.core.annotation;
+import com.alibaba.testable.core.model.MockType;
+
import java.lang.annotation.*;
/**
@@ -12,6 +14,11 @@ import java.lang.annotation.*;
@Documented
public @interface TestableMock {
+ /**
+ * type of mock method
+ */
+ MockType value() default MockType.MEMBER_METHOD;
+
/**
* mock specified method instead of method with same name
*/
diff --git a/testable-core/src/main/java/com/alibaba/testable/core/constant/ConstPool.java b/testable-core/src/main/java/com/alibaba/testable/core/constant/ConstPool.java
index fc0d115..78684ae 100644
--- a/testable-core/src/main/java/com/alibaba/testable/core/constant/ConstPool.java
+++ b/testable-core/src/main/java/com/alibaba/testable/core/constant/ConstPool.java
@@ -5,7 +5,6 @@ package com.alibaba.testable.core.constant;
*/
public final class ConstPool {
- public static final String TESTABLE_PRIVATE_ACCESSOR = "com.alibaba.testable.core.accessor.PrivateAccessor";
public static final String TEST_POSTFIX = "Test";
}
diff --git a/testable-core/src/main/java/com/alibaba/testable/core/model/MockType.java b/testable-core/src/main/java/com/alibaba/testable/core/model/MockType.java
new file mode 100644
index 0000000..aff6f8a
--- /dev/null
+++ b/testable-core/src/main/java/com/alibaba/testable/core/model/MockType.java
@@ -0,0 +1,14 @@
+package com.alibaba.testable.core.model;
+
+/**
+ * Type of mock method
+ *
+ * @author flin
+ */
+public enum MockType {
+
+ MEMBER_METHOD,
+ STATIC_METHOD,
+ CONSTRUCTOR
+
+}
diff --git a/testable-core/src/main/java/com/alibaba/testable/core/util/TypeUtil.java b/testable-core/src/main/java/com/alibaba/testable/core/util/TypeUtil.java
index 2a63695..4afde11 100644
--- a/testable-core/src/main/java/com/alibaba/testable/core/util/TypeUtil.java
+++ b/testable-core/src/main/java/com/alibaba/testable/core/util/TypeUtil.java
@@ -36,7 +36,7 @@ public class TypeUtil {
/**
* type equals
*/
- public static boolean typeEquals(Class>[] classesLeft, Class>[] classesRight) {
+ private static boolean typeEquals(Class>[] classesLeft, Class>[] classesRight) {
if (classesLeft.length != classesRight.length) {
return false;
}
diff --git a/testable-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/testable-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor
deleted file mode 100644
index c5c34d5..0000000
--- a/testable-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor
+++ /dev/null
@@ -1 +0,0 @@
-com.alibaba.testable.core.processor.EnablePrivateAccessProcessor
diff --git a/testable-processor/pom.xml b/testable-processor/pom.xml
new file mode 100644
index 0000000..76ba6e8
--- /dev/null
+++ b/testable-processor/pom.xml
@@ -0,0 +1,59 @@
+
+
+ 4.0.0
+
+ Unit test enhancement toolkit
+ com.alibaba.testable
+ testable-processor
+ 0.2.1-SNAPSHOT
+ testable-processor
+
+
+ 1.6
+ 1.6
+ UTF-8
+ 3.8.1
+ 5.6.2
+ 0.2.1-SNAPSHOT
+
+
+
+
+ com.alibaba.testable
+ testable-core
+ ${testable.version}
+
+
+ sun.jdk
+ tools
+ ${java.version}
+ system
+ ${java.home}/../lib/tools.jar
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ ${junit.version}
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${plugin.compiler.version}
+
+ ${project.compiler.level}
+ ${project.compiler.level}
+ ${project.build.sourceEncoding}
+ -proc:none
+
+
+
+
+
+
diff --git a/testable-core/src/main/java/com/alibaba/testable/core/processor/EnablePrivateAccessProcessor.java b/testable-processor/src/main/java/com/alibaba/testable/processor/EnablePrivateAccessProcessor.java
similarity index 86%
rename from testable-core/src/main/java/com/alibaba/testable/core/processor/EnablePrivateAccessProcessor.java
rename to testable-processor/src/main/java/com/alibaba/testable/processor/EnablePrivateAccessProcessor.java
index 17582d2..c3dc5fb 100644
--- a/testable-core/src/main/java/com/alibaba/testable/core/processor/EnablePrivateAccessProcessor.java
+++ b/testable-processor/src/main/java/com/alibaba/testable/processor/EnablePrivateAccessProcessor.java
@@ -1,10 +1,10 @@
-package com.alibaba.testable.core.processor;
+package com.alibaba.testable.processor;
-import com.alibaba.testable.core.annotation.EnablePrivateAccess;
-import com.alibaba.testable.core.constant.ConstPool;
-import com.alibaba.testable.core.model.TestableContext;
-import com.alibaba.testable.core.translator.EnablePrivateAccessTranslator;
-import com.alibaba.testable.core.util.TestableLogger;
+import com.alibaba.testable.processor.annotation.EnablePrivateAccess;
+import com.alibaba.testable.processor.constant.ConstPool;
+import com.alibaba.testable.processor.model.TestableContext;
+import com.alibaba.testable.processor.translator.EnablePrivateAccessTranslator;
+import com.alibaba.testable.processor.util.TestableLogger;
import com.sun.tools.javac.api.JavacTrees;
import com.sun.tools.javac.code.Symbol;
import com.sun.tools.javac.processing.JavacProcessingEnvironment;
@@ -26,7 +26,7 @@ import java.util.Set;
/**
* @author flin
*/
-@SupportedAnnotationTypes("com.alibaba.testable.core.annotation.EnablePrivateAccess")
+@SupportedAnnotationTypes("com.alibaba.testable.processor.annotation.EnablePrivateAccess")
public class EnablePrivateAccessProcessor extends AbstractProcessor {
private TestableContext cx;
diff --git a/testable-core/src/main/java/com/alibaba/testable/core/annotation/EnablePrivateAccess.java b/testable-processor/src/main/java/com/alibaba/testable/processor/annotation/EnablePrivateAccess.java
similarity index 83%
rename from testable-core/src/main/java/com/alibaba/testable/core/annotation/EnablePrivateAccess.java
rename to testable-processor/src/main/java/com/alibaba/testable/processor/annotation/EnablePrivateAccess.java
index bca263a..c151fcc 100644
--- a/testable-core/src/main/java/com/alibaba/testable/core/annotation/EnablePrivateAccess.java
+++ b/testable-processor/src/main/java/com/alibaba/testable/processor/annotation/EnablePrivateAccess.java
@@ -1,4 +1,4 @@
-package com.alibaba.testable.core.annotation;
+package com.alibaba.testable.processor.annotation;
import java.lang.annotation.*;
diff --git a/testable-processor/src/main/java/com/alibaba/testable/processor/constant/ConstPool.java b/testable-processor/src/main/java/com/alibaba/testable/processor/constant/ConstPool.java
new file mode 100644
index 0000000..65e5218
--- /dev/null
+++ b/testable-processor/src/main/java/com/alibaba/testable/processor/constant/ConstPool.java
@@ -0,0 +1,11 @@
+package com.alibaba.testable.processor.constant;
+
+/**
+ * @author flin
+ */
+public final class ConstPool {
+
+ public static final String TESTABLE_PRIVATE_ACCESSOR = "com.alibaba.testable.core.accessor.PrivateAccessor";
+ public static final String TEST_POSTFIX = "Test";
+
+}
diff --git a/testable-core/src/main/java/com/alibaba/testable/core/generator/BaseGenerator.java b/testable-processor/src/main/java/com/alibaba/testable/processor/generator/BaseGenerator.java
similarity index 84%
rename from testable-core/src/main/java/com/alibaba/testable/core/generator/BaseGenerator.java
rename to testable-processor/src/main/java/com/alibaba/testable/processor/generator/BaseGenerator.java
index 884943f..4778f84 100644
--- a/testable-core/src/main/java/com/alibaba/testable/core/generator/BaseGenerator.java
+++ b/testable-processor/src/main/java/com/alibaba/testable/processor/generator/BaseGenerator.java
@@ -1,6 +1,6 @@
-package com.alibaba.testable.core.generator;
+package com.alibaba.testable.processor.generator;
-import com.alibaba.testable.core.model.TestableContext;
+import com.alibaba.testable.processor.model.TestableContext;
import com.sun.tools.javac.tree.JCTree.*;
/**
diff --git a/testable-core/src/main/java/com/alibaba/testable/core/generator/PrivateAccessStatementGenerator.java b/testable-processor/src/main/java/com/alibaba/testable/processor/generator/PrivateAccessStatementGenerator.java
similarity index 88%
rename from testable-core/src/main/java/com/alibaba/testable/core/generator/PrivateAccessStatementGenerator.java
rename to testable-processor/src/main/java/com/alibaba/testable/processor/generator/PrivateAccessStatementGenerator.java
index 1404f2b..7dd9dd8 100644
--- a/testable-core/src/main/java/com/alibaba/testable/core/generator/PrivateAccessStatementGenerator.java
+++ b/testable-processor/src/main/java/com/alibaba/testable/processor/generator/PrivateAccessStatementGenerator.java
@@ -1,7 +1,7 @@
-package com.alibaba.testable.core.generator;
+package com.alibaba.testable.processor.generator;
-import com.alibaba.testable.core.model.TestableContext;
-import com.alibaba.testable.core.constant.ConstPool;
+import com.alibaba.testable.processor.model.TestableContext;
+import com.alibaba.testable.processor.constant.ConstPool;
import com.sun.tools.javac.tree.JCTree.*;
import com.sun.tools.javac.util.List;
import com.sun.tools.javac.util.ListBuffer;
diff --git a/testable-core/src/main/java/com/alibaba/testable/core/model/TestableContext.java b/testable-processor/src/main/java/com/alibaba/testable/processor/model/TestableContext.java
similarity index 94%
rename from testable-core/src/main/java/com/alibaba/testable/core/model/TestableContext.java
rename to testable-processor/src/main/java/com/alibaba/testable/processor/model/TestableContext.java
index 2a77bc9..76419fd 100644
--- a/testable-core/src/main/java/com/alibaba/testable/core/model/TestableContext.java
+++ b/testable-processor/src/main/java/com/alibaba/testable/processor/model/TestableContext.java
@@ -1,6 +1,6 @@
-package com.alibaba.testable.core.model;
+package com.alibaba.testable.processor.model;
-import com.alibaba.testable.core.util.TestableLogger;
+import com.alibaba.testable.processor.util.TestableLogger;
import com.sun.tools.javac.api.JavacTrees;
import com.sun.tools.javac.tree.TreeMaker;
import com.sun.tools.javac.util.Names;
diff --git a/testable-core/src/main/java/com/alibaba/testable/core/translator/BaseTranslator.java b/testable-processor/src/main/java/com/alibaba/testable/processor/translator/BaseTranslator.java
similarity index 94%
rename from testable-core/src/main/java/com/alibaba/testable/core/translator/BaseTranslator.java
rename to testable-processor/src/main/java/com/alibaba/testable/processor/translator/BaseTranslator.java
index 197c4c3..5d3d8f4 100644
--- a/testable-core/src/main/java/com/alibaba/testable/core/translator/BaseTranslator.java
+++ b/testable-processor/src/main/java/com/alibaba/testable/processor/translator/BaseTranslator.java
@@ -1,4 +1,4 @@
-package com.alibaba.testable.core.translator;
+package com.alibaba.testable.processor.translator;
import com.sun.tools.javac.tree.JCTree.*;
import com.sun.tools.javac.tree.TreeTranslator;
diff --git a/testable-core/src/main/java/com/alibaba/testable/core/translator/EnablePrivateAccessTranslator.java b/testable-processor/src/main/java/com/alibaba/testable/processor/translator/EnablePrivateAccessTranslator.java
similarity index 94%
rename from testable-core/src/main/java/com/alibaba/testable/core/translator/EnablePrivateAccessTranslator.java
rename to testable-processor/src/main/java/com/alibaba/testable/processor/translator/EnablePrivateAccessTranslator.java
index cedc798..3ae3c1b 100644
--- a/testable-core/src/main/java/com/alibaba/testable/core/translator/EnablePrivateAccessTranslator.java
+++ b/testable-processor/src/main/java/com/alibaba/testable/processor/translator/EnablePrivateAccessTranslator.java
@@ -1,8 +1,8 @@
-package com.alibaba.testable.core.translator;
+package com.alibaba.testable.processor.translator;
-import com.alibaba.testable.core.constant.ConstPool;
-import com.alibaba.testable.core.generator.PrivateAccessStatementGenerator;
-import com.alibaba.testable.core.model.TestableContext;
+import com.alibaba.testable.processor.constant.ConstPool;
+import com.alibaba.testable.processor.generator.PrivateAccessStatementGenerator;
+import com.alibaba.testable.processor.model.TestableContext;
import com.sun.tools.javac.tree.JCTree.*;
import com.sun.tools.javac.util.ListBuffer;
import com.sun.tools.javac.util.Name;
diff --git a/testable-core/src/main/java/com/alibaba/testable/core/util/StringUtil.java b/testable-processor/src/main/java/com/alibaba/testable/processor/util/StringUtil.java
similarity index 93%
rename from testable-core/src/main/java/com/alibaba/testable/core/util/StringUtil.java
rename to testable-processor/src/main/java/com/alibaba/testable/processor/util/StringUtil.java
index c32ea51..94669d9 100644
--- a/testable-core/src/main/java/com/alibaba/testable/core/util/StringUtil.java
+++ b/testable-processor/src/main/java/com/alibaba/testable/processor/util/StringUtil.java
@@ -1,4 +1,4 @@
-package com.alibaba.testable.core.util;
+package com.alibaba.testable.processor.util;
import java.util.List;
diff --git a/testable-core/src/main/java/com/alibaba/testable/core/util/TestableLogger.java b/testable-processor/src/main/java/com/alibaba/testable/processor/util/TestableLogger.java
similarity index 92%
rename from testable-core/src/main/java/com/alibaba/testable/core/util/TestableLogger.java
rename to testable-processor/src/main/java/com/alibaba/testable/processor/util/TestableLogger.java
index aac6273..b326715 100644
--- a/testable-core/src/main/java/com/alibaba/testable/core/util/TestableLogger.java
+++ b/testable-processor/src/main/java/com/alibaba/testable/processor/util/TestableLogger.java
@@ -1,4 +1,4 @@
-package com.alibaba.testable.core.util;
+package com.alibaba.testable.processor.util;
import javax.annotation.processing.Messager;
import javax.tools.Diagnostic;
diff --git a/testable-processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/testable-processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor
new file mode 100644
index 0000000..70c23c8
--- /dev/null
+++ b/testable-processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor
@@ -0,0 +1 @@
+com.alibaba.testable.processor.EnablePrivateAccessProcessor
diff --git a/testable-core/src/test/java/com/alibaba/testable/core/util/StringUtilTest.java b/testable-processor/src/test/java/com/alibaba/testable/processor/util/StringUtilTest.java
similarity index 90%
rename from testable-core/src/test/java/com/alibaba/testable/core/util/StringUtilTest.java
rename to testable-processor/src/test/java/com/alibaba/testable/processor/util/StringUtilTest.java
index 131a3a1..c7c1935 100644
--- a/testable-core/src/test/java/com/alibaba/testable/core/util/StringUtilTest.java
+++ b/testable-processor/src/test/java/com/alibaba/testable/processor/util/StringUtilTest.java
@@ -1,4 +1,4 @@
-package com.alibaba.testable.core.util;
+package com.alibaba.testable.processor.util;
import org.junit.jupiter.api.Test;