From e20c5c3d817223937ef9390528ec859bdabe401d Mon Sep 17 00:00:00 2001 From: huangchengxing <841396397@qq.com> Date: Sun, 28 Aug 2022 15:06:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84annotation=E5=8C=85=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/annotation/AnnotationForTest.java | 29 ---- .../core/annotation/AnnotationUtilTest.java | 141 ++++++++++++++---- .../CombinationAnnotationElementTest.java | 60 ++++++++ .../annotation/RepeatAnnotationForTest.java | 16 -- 4 files changed, 174 insertions(+), 72 deletions(-) delete mode 100755 hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationForTest.java create mode 100644 hutool-core/src/test/java/cn/hutool/core/annotation/CombinationAnnotationElementTest.java delete mode 100755 hutool-core/src/test/java/cn/hutool/core/annotation/RepeatAnnotationForTest.java diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationForTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationForTest.java deleted file mode 100755 index f109e836d..000000000 --- a/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationForTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.hutool.core.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * 用于单元测试的注解类
- * 注解类相关说明见:https://www.cnblogs.com/xdp-gacl/p/3622275.html - * - * @author looly - */ -// Retention注解决定MyAnnotation注解的生命周期 -@Retention(RetentionPolicy.RUNTIME) -// Target注解决定MyAnnotation注解可以加在哪些成分上,如加在类身上,或者属性身上,或者方法身上等成分 -@Target({ ElementType.METHOD, ElementType.TYPE }) -public @interface AnnotationForTest { - - /** - * 注解的默认属性值 - * - * @return 属性值 - */ - String value() default ""; - - @Alias("value") - String retry() default ""; -} diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationUtilTest.java index 3032ed5ca..994d3e2d1 100755 --- a/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationUtilTest.java @@ -1,49 +1,136 @@ package cn.hutool.core.annotation; +import cn.hutool.core.util.ObjUtil; import org.junit.Assert; import org.junit.Test; -import java.lang.annotation.Annotation; +import java.lang.annotation.*; +import java.util.Map; +/** + * test for {@link AnnotationUtil} + */ public class AnnotationUtilTest { @Test - public void getCombinationAnnotationsTest(){ - final Annotation[] annotations = AnnotationUtil.getAnnotations(ClassWithAnnotation.class, true); - Assert.assertNotNull(annotations); + public void testToCombination() { + CombinationAnnotationElement element = AnnotationUtil.toCombination(ClassForTest.class); + Assert.assertEquals(2, element.getAnnotations().length); + } + + @Test + public void testGetAnnotations() { + Annotation[] annotations = AnnotationUtil.getAnnotations(ClassForTest.class, true); Assert.assertEquals(2, annotations.length); - } - - @Test - public void getCombinationAnnotationsWithClassTest(){ - final AnnotationForTest[] annotations = AnnotationUtil.getCombinationAnnotations(ClassWithAnnotation.class, AnnotationForTest.class); - Assert.assertNotNull(annotations); + annotations = AnnotationUtil.getAnnotations(ClassForTest.class, false); Assert.assertEquals(1, annotations.length); - Assert.assertEquals("测试", annotations[0].value()); } @Test - public void getAnnotationValueTest() { - final Object value = AnnotationUtil.getAnnotationValue(ClassWithAnnotation.class, AnnotationForTest.class); - Assert.assertEquals("测试", value); - + public void testGetCombinationAnnotations() { + MetaAnnotationForTest[] annotations = AnnotationUtil.getCombinationAnnotations(ClassForTest.class, MetaAnnotationForTest.class); + Assert.assertEquals(1, annotations.length); } @Test - public void getAnnotationSyncAlias() { - // 直接获取 - Assert.assertEquals("", ClassWithAnnotation.class.getAnnotation(AnnotationForTest.class).retry()); + public void testAnnotations() { + MetaAnnotationForTest[] annotations1 = AnnotationUtil.getAnnotations(ClassForTest.class, false, MetaAnnotationForTest.class); + Assert.assertEquals(0, annotations1.length); + annotations1 = AnnotationUtil.getAnnotations(ClassForTest.class, true, MetaAnnotationForTest.class); + Assert.assertEquals(1, annotations1.length); - // 加别名适配 - final AnnotationForTest annotation = AnnotationUtil.getAnnotationAlias(ClassWithAnnotation.class, AnnotationForTest.class); - Assert.assertEquals("测试", annotation.retry()); + Annotation[] annotations2 = AnnotationUtil.getAnnotations( + ClassForTest.class, false, t -> ObjUtil.equals(t.annotationType(), MetaAnnotationForTest.class) + ); + Assert.assertEquals(0, annotations2.length); + annotations2 = AnnotationUtil.getAnnotations( + ClassForTest.class, true, t -> ObjUtil.equals(t.annotationType(), MetaAnnotationForTest.class) + ); + Assert.assertEquals(1, annotations2.length); } - @AnnotationForTest("测试") - @RepeatAnnotationForTest - static class ClassWithAnnotation{ - public void test(){ - - } + @Test + public void testGetAnnotation() { + MetaAnnotationForTest annotation = AnnotationUtil.getAnnotation(ClassForTest.class, MetaAnnotationForTest.class); + Assert.assertNotNull(annotation); } + + @Test + public void testHasAnnotation() { + Assert.assertTrue(AnnotationUtil.hasAnnotation(ClassForTest.class, MetaAnnotationForTest.class)); + } + + @Test + public void testGetAnnotationValue() { + AnnotationForTest annotation = ClassForTest.class.getAnnotation(AnnotationForTest.class); + Assert.assertEquals(annotation.value(), AnnotationUtil.getAnnotationValue(ClassForTest.class, AnnotationForTest.class)); + Assert.assertEquals(annotation.value(), AnnotationUtil.getAnnotationValue(ClassForTest.class, AnnotationForTest.class, "value")); + Assert.assertNull(AnnotationUtil.getAnnotationValue(ClassForTest.class, AnnotationForTest.class, "property")); + } + + @Test + public void testGetAnnotationValueMap() { + AnnotationForTest annotation = ClassForTest.class.getAnnotation(AnnotationForTest.class); + Map valueMap = AnnotationUtil.getAnnotationValueMap(ClassForTest.class, AnnotationForTest.class); + Assert.assertNotNull(valueMap); + Assert.assertEquals(1, valueMap.size()); + Assert.assertEquals(annotation.value(), valueMap.get("value")); + } + + @Test + public void testGetRetentionPolicy() { + RetentionPolicy policy = AnnotationForTest.class.getAnnotation(Retention.class).value(); + Assert.assertEquals(policy, AnnotationUtil.getRetentionPolicy(AnnotationForTest.class)); + } + + @Test + public void testGetTargetType() { + ElementType[] types = AnnotationForTest.class.getAnnotation(Target.class).value(); + Assert.assertArrayEquals(types, AnnotationUtil.getTargetType(AnnotationForTest.class)); + } + + @Test + public void testIsDocumented() { + Assert.assertFalse(AnnotationUtil.isDocumented(AnnotationForTest.class)); + } + + @Test + public void testIsInherited() { + Assert.assertFalse(AnnotationUtil.isInherited(AnnotationForTest.class)); + } + + @Test + public void testSetValue() { + AnnotationForTest annotation = ClassForTest.class.getAnnotation(AnnotationForTest.class); + String newValue = "is a new value"; + Assert.assertNotEquals(newValue, annotation.value()); + AnnotationUtil.setValue(annotation, "value", newValue); + Assert.assertEquals(newValue, annotation.value()); + } + + @Test + public void testGetAnnotationAlias() { + MetaAnnotationForTest annotation = AnnotationUtil.getAnnotationAlias(AnnotationForTest.class, MetaAnnotationForTest.class); + Assert.assertEquals(annotation.value(), annotation.alias()); + Assert.assertEquals(MetaAnnotationForTest.class, annotation.annotationType()); + } + + @Target(ElementType.TYPE_USE) + @Retention(RetentionPolicy.RUNTIME) + private @interface MetaAnnotationForTest{ + @Alias(value = "alias") + String value() default ""; + String alias() default ""; + } + + @MetaAnnotationForTest("foo") + @Target(ElementType.TYPE_USE) + @Retention(RetentionPolicy.RUNTIME) + private @interface AnnotationForTest{ + String value() default ""; + } + + @AnnotationForTest("foo") + private static class ClassForTest{} + } diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/CombinationAnnotationElementTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/CombinationAnnotationElementTest.java new file mode 100644 index 000000000..cb81ef2cb --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/annotation/CombinationAnnotationElementTest.java @@ -0,0 +1,60 @@ +package cn.hutool.core.annotation; + +import org.junit.Assert; +import org.junit.Test; + +import java.lang.annotation.*; + +/** + * test for {@link CombinationAnnotationElement} + */ +public class CombinationAnnotationElementTest { + + @Test + public void testOf() { + CombinationAnnotationElement element = CombinationAnnotationElement.of(ClassForTest.class, a -> true); + Assert.assertNotNull(element); + } + + @Test + public void testIsAnnotationPresent() { + CombinationAnnotationElement element = CombinationAnnotationElement.of(ClassForTest.class, a -> true); + Assert.assertTrue(element.isAnnotationPresent(MetaAnnotationForTest.class)); + } + + @Test + public void testGetAnnotation() { + AnnotationForTest annotation1 = ClassForTest.class.getAnnotation(AnnotationForTest.class); + MetaAnnotationForTest annotation2 = AnnotationForTest.class.getAnnotation(MetaAnnotationForTest.class); + CombinationAnnotationElement element = CombinationAnnotationElement.of(ClassForTest.class, a -> true); + Assert.assertEquals(annotation1, element.getAnnotation(AnnotationForTest.class)); + Assert.assertEquals(annotation2, element.getAnnotation(MetaAnnotationForTest.class)); + } + + @Test + public void testGetAnnotations() { + CombinationAnnotationElement element = CombinationAnnotationElement.of(ClassForTest.class, a -> true); + Annotation[] annotations = element.getAnnotations(); + Assert.assertEquals(2, annotations.length); + } + + @Test + public void testGetDeclaredAnnotations() { + CombinationAnnotationElement element = CombinationAnnotationElement.of(ClassForTest.class, a -> true); + Annotation[] annotations = element.getDeclaredAnnotations(); + Assert.assertEquals(2, annotations.length); + } + + @Target(ElementType.TYPE_USE) + @Retention(RetentionPolicy.RUNTIME) + private @interface MetaAnnotationForTest{ } + + @MetaAnnotationForTest + @Target(ElementType.TYPE_USE) + @Retention(RetentionPolicy.RUNTIME) + private @interface AnnotationForTest{ } + + @AnnotationForTest + private static class ClassForTest{} + +} diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/RepeatAnnotationForTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/RepeatAnnotationForTest.java deleted file mode 100755 index cc71c68da..000000000 --- a/hutool-core/src/test/java/cn/hutool/core/annotation/RepeatAnnotationForTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.hutool.core.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * @author hongda.li 2022-04-26 17:09 - */ -@AnnotationForTest("repeat-annotation") -@Retention(RetentionPolicy.RUNTIME) -// Target注解决定MyAnnotation注解可以加在哪些成分上,如加在类身上,或者属性身上,或者方法身上等成分 -@Target({ ElementType.METHOD, ElementType.TYPE }) -public @interface RepeatAnnotationForTest { -}