master
meethigher 3 years ago
parent 8294db3e2a
commit e2b65fe549
  1. 33
      .gitignore
  2. 45
      pom.xml
  3. 24
      src/main/java/top/meethigher/mock/instance/ObjectTest.java
  4. 56
      src/main/java/top/meethigher/mock/instance/Test.java
  5. 15
      src/main/java/top/meethigher/mock/instance/annotation/MockInstance.java
  6. 27
      src/main/java/top/meethigher/mock/instance/proxy/MockInstanceHandler.java

33
.gitignore vendored

@ -0,0 +1,33 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>top.meethigher</groupId>
<artifactId>mock-instance</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>top.meethigher</groupId>
<artifactId>cache-store</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>top.meethigher</groupId>
<artifactId>object-converter</artifactId>
<version>1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.bytebuddy/byte-buddy -->
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
<version>1.12.18</version>
</dependency>
</dependencies>
</project>

@ -0,0 +1,24 @@
package top.meethigher.mock.instance;
public class ObjectTest {
private String name;
private String money;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMoney() {
return money;
}
public void setMoney(String money) {
this.money = money;
}
}

@ -0,0 +1,56 @@
package top.meethigher.mock.instance;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.implementation.FixedValue;
import net.bytebuddy.matcher.ElementMatchers;
import top.meethigher.mock.instance.proxy.MockInstanceHandler;
public class Test {
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
// //第一种方式,有注解:需要参考一下Lombok的做法
// //@MockInstance
// //ObjectTest objectTest=new ObjectTest();
//
// //第二种方式,无注解
// ObjectTest objectTest = new MockInstanceHandler().instance(ObjectTest.class);
//
// /**
// * toString获取内容如下
// * <p>
// * ObjectTest objectTest=new ObjectTest();
// * objectTest.setMoney("money-test");
// * objectTest.setName("name-test");
// * </p>
// */
//// System.out.println(objectTest.toString());
//
// /**
// * 获取内容如下
// * <p>
// * name-test
// * </p>
// */
// System.out.println(objectTest.getName());
Class<?> dynamicType = new ByteBuddy()
.subclass(Object.class)
.method(ElementMatchers.named("toString"))
.intercept(FixedValue.value("Hello World"))
.make()
.load(ObjectTest.class.getClassLoader())
.getLoaded();
ObjectTest instance = (ObjectTest)dynamicType.newInstance();
String toString = instance.toString();
System.out.println(toString);
System.out.println(instance.getClass().getCanonicalName());
}
}

@ -0,0 +1,15 @@
package top.meethigher.mock.instance.annotation;
import java.lang.annotation.*;
/**
* 针对测试时使用的Mock注解
*
* @author chenchuancheng
* @since 2022/11/8 16:12
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.LOCAL_VARIABLE)
public @interface MockInstance {
}

@ -0,0 +1,27 @@
package top.meethigher.mock.instance.proxy;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MockInstanceHandler {
public <T> T instance(Class<?> clazz) {
if (clazz == null) {
throw new IllegalArgumentException("参数 'clazz' 不可为空");
}
T t = (T) Enhancer.create(clazz, (MethodInterceptor) (o, method, objects, methodProxy) -> {
System.out.println(method.getName());
return method.invoke(o, objects);
});
return t;
}
}
Loading…
Cancel
Save