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