From 745ebacb4daed21c22808a4781d52c3b248c7b10 Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 4 Oct 2025 16:35:13 +0800 Subject: [PATCH] add test --- .../java/cn/hutool/v7/core/bean/BeanUtil.java | 56 ++++++++++--------- .../java/cn/hutool/v7/core/bean/DynaBean.java | 2 + .../core/annotation/AnnotationUtilTest.java | 3 +- .../cn/hutool/v7/core/bean/BeanUtilTest.java | 44 ++++++++++++--- .../cn/hutool/v7/core/bean/DynaBeanTest.java | 18 ++++++ 5 files changed, 88 insertions(+), 35 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/bean/BeanUtil.java b/hutool-core/src/main/java/cn/hutool/v7/core/bean/BeanUtil.java index 1b1df1c59..b4f4a1544 100644 --- a/hutool-core/src/main/java/cn/hutool/v7/core/bean/BeanUtil.java +++ b/hutool-core/src/main/java/cn/hutool/v7/core/bean/BeanUtil.java @@ -69,7 +69,7 @@ public class BeanUtil { * @since 3.0.7 */ public static DynaBean createDynaBean(final Object bean) { - return new DynaBean(bean); + return DynaBean.of(bean); } /** @@ -578,31 +578,7 @@ public class BeanUtil { return ClassUtil.getClassName(bean, isSimple).equals(isSimple ? StrUtil.upperFirst(beanClassName) : beanClassName); } - /** - * 编辑Bean的字段,static字段不会处理
- * 例如需要对指定的字段做判空操作、null转""操作等等。 - * - * @param bean bean - * @param editor 编辑器函数 - * @param 被编辑的Bean类型 - * @return bean - * @since 5.6.4 - */ - public static T edit(final T bean, final UnaryOperator editor) { - if (bean == null) { - return null; - } - - final Field[] fields = FieldUtil.getFields(bean.getClass()); - for (final Field field : fields) { - if (ModifierUtil.isStatic(field)) { - continue; - } - editor.apply(field); - } - return bean; - } - + // region ----- edit /** * 把Bean里面的String属性做trim操作。此方法直接对传入的Bean做修改。 *

@@ -634,6 +610,33 @@ public class BeanUtil { }); } + /** + * 编辑Bean的字段,static字段不会处理
+ * 例如需要对指定的字段做判空操作、null转""操作等等。 + * + * @param bean bean + * @param editor 编辑器函数 + * @param 被编辑的Bean类型 + * @return bean + * @since 5.6.4 + */ + public static T edit(final T bean, final UnaryOperator editor) { + if (bean == null) { + return null; + } + + final Field[] fields = FieldUtil.getFields(bean.getClass()); + for (final Field field : fields) { + if (ModifierUtil.isStatic(field)) { + continue; + } + editor.apply(field); + } + return bean; + } + // endregion + + // region ----- check /** * 判断Bean是否为空对象,空对象表示本身为{@code null}或者所有属性都为{@code null}
* 此方法不判断static属性 @@ -725,6 +728,7 @@ public class BeanUtil { return hasSetter(clazz) || hasPublicField(clazz); } + // endregion // region ----- hasXXX diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/bean/DynaBean.java b/hutool-core/src/main/java/cn/hutool/v7/core/bean/DynaBean.java index 9ebe6d229..02b62bf35 100644 --- a/hutool-core/src/main/java/cn/hutool/v7/core/bean/DynaBean.java +++ b/hutool-core/src/main/java/cn/hutool/v7/core/bean/DynaBean.java @@ -26,6 +26,7 @@ import cn.hutool.v7.core.reflect.ClassUtil; import cn.hutool.v7.core.reflect.ConstructorUtil; import cn.hutool.v7.core.reflect.method.MethodUtil; +import java.io.Serial; import java.io.Serializable; import java.util.Collection; import java.util.List; @@ -39,6 +40,7 @@ import java.util.Map; * @since 3.0.7 */ public class DynaBean implements Cloneable, Serializable { + @Serial private static final long serialVersionUID = 1L; /** diff --git a/hutool-core/src/test/java/cn/hutool/v7/core/annotation/AnnotationUtilTest.java b/hutool-core/src/test/java/cn/hutool/v7/core/annotation/AnnotationUtilTest.java index 8d9dcb5d9..464d6ccff 100644 --- a/hutool-core/src/test/java/cn/hutool/v7/core/annotation/AnnotationUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/v7/core/annotation/AnnotationUtilTest.java @@ -187,7 +187,8 @@ public class AnnotationUtilTest { @Test public void testIsInherited() { - Assertions.assertFalse(AnnotationUtil.isInherited(AnnotationForTest.class)); + Assertions.assertTrue(AnnotationUtil.isInherited(AnnotationForTest.class)); + Assertions.assertFalse(AnnotationUtil.isInherited(MetaAnnotationForTest.class)); } @Test diff --git a/hutool-core/src/test/java/cn/hutool/v7/core/bean/BeanUtilTest.java b/hutool-core/src/test/java/cn/hutool/v7/core/bean/BeanUtilTest.java index 6b9e2728a..c4a24e44c 100644 --- a/hutool-core/src/test/java/cn/hutool/v7/core/bean/BeanUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/v7/core/bean/BeanUtilTest.java @@ -39,11 +39,14 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import java.beans.PropertyDescriptor; +import java.io.Serial; import java.io.Serializable; +import java.lang.reflect.Field; import java.lang.reflect.Type; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.*; +import java.util.function.Predicate; import java.util.stream.Collectors; import static org.junit.jupiter.api.Assertions.*; @@ -71,17 +74,15 @@ public class BeanUtilTest { @Test public void fillBeanTest() { - final Person person = BeanUtil.fillBean(new Person(), new ValueProvider() { + final Person person = BeanUtil.fillBean(new Person(), new ValueProvider<>() { @Override public Object value(final String key, final Type valueType) { - switch (key) { - case "name": - return "张三"; - case "age": - return 18; - } - return null; + return switch (key) { + case "name" -> "张三"; + case "age" -> 18; + default -> null; + }; } @Override @@ -686,6 +687,7 @@ public class BeanUtilTest { @Data public static class HllFoodEntity implements Serializable { + @Serial private static final long serialVersionUID = 1L; private String bookId; @@ -791,6 +793,7 @@ public class BeanUtilTest { @Data public static class PrivilegeIClassification implements Serializable { + @Serial private static final long serialVersionUID = 1L; private String id; @@ -891,6 +894,7 @@ public class BeanUtilTest { @Data public static class Student implements Serializable{ + @Serial private static final long serialVersionUID = 1L; String name; @@ -1011,4 +1015,28 @@ public class BeanUtilTest { final boolean b = BeanUtil.hasGetter(Object.class); assertFalse(b); } + + @Test + void checkBean_withNullBean_shouldReturnTrue() { + Predicate predicate = field -> true; + assertTrue(BeanUtil.checkBean(null, predicate)); + } + + @Test + void checkBean_withNoMatchingFields_shouldReturnFalse() { + Person bean = new Person(); + Predicate predicate = field -> false; + assertFalse(BeanUtil.checkBean(bean, predicate)); + } + + @Test + void checkBean_withMatchingField_shouldReturnTrue() { + Person bean = new Person(); + Predicate predicate = field -> "name".equals(field.getName()); + assertTrue(BeanUtil.checkBean(bean, predicate)); + + predicate = field -> "age".equals(field.getName()); + assertTrue(BeanUtil.checkBean(bean, predicate)); + } + } diff --git a/hutool-core/src/test/java/cn/hutool/v7/core/bean/DynaBeanTest.java b/hutool-core/src/test/java/cn/hutool/v7/core/bean/DynaBeanTest.java index 2ac6a1f3b..462cfefd9 100644 --- a/hutool-core/src/test/java/cn/hutool/v7/core/bean/DynaBeanTest.java +++ b/hutool-core/src/test/java/cn/hutool/v7/core/bean/DynaBeanTest.java @@ -20,6 +20,9 @@ import lombok.Data; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; + /** * {@link DynaBean}单元测试 * @@ -27,6 +30,21 @@ import org.junit.jupiter.api.Test; */ public class DynaBeanTest { + @Test + void createDynaBean_withNullBean_shouldThrowException() { + assertThrows(IllegalArgumentException.class, () -> BeanUtil.createDynaBean(null)); + } + + @Test + void createDynaBean_withPlainObject_shouldReturnDynaBean() { + BeanUtilTest.Person bean = new BeanUtilTest.Person(); + DynaBean dynaBean = BeanUtil.createDynaBean(bean); + + assertNotNull(dynaBean); + assertEquals(bean, dynaBean.getBean()); + assertEquals(BeanUtilTest.Person.class, dynaBean.getBeanClass()); + } + @Test public void beanTest() { final User user = new User();