parent
8294db3e2a
commit
e2b65fe549
6 changed files with 200 additions and 0 deletions
@ -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…
Reference in new issue