From 64fdf75fc637c06671acf41b3475c1cbec526631 Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 29 Mar 2022 00:13:00 +0800 Subject: [PATCH] add test --- CHANGELOG.md | 3 +- .../hutool/extra/cglib/BeanCopierCache.java | 35 +++++++++++++------ .../cn/hutool/extra/cglib/CglibUtilTest.java | 18 ++++++++-- 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5820371f8..80b60f296 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,10 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.0.M2 (2022-03-28) +# 5.8.0.M2 (2022-03-29) ### ❌不兼容特性 +* 【extra 】 【可能兼容问题】BeanCopierCache的key结构变更 ### 🐣新特性 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/cglib/BeanCopierCache.java b/hutool-extra/src/main/java/cn/hutool/extra/cglib/BeanCopierCache.java index 1db413a36..a2a012a10 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/cglib/BeanCopierCache.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/cglib/BeanCopierCache.java @@ -29,24 +29,37 @@ public enum BeanCopierCache { * @return Map中对应的BeanCopier */ public BeanCopier get(Class srcClass, Class targetClass, Converter converter) { - final String key = genKey(srcClass, targetClass, converter); - return cache.get(key, () -> BeanCopier.create(srcClass, targetClass, converter != null)); + return get(srcClass, targetClass, null != converter); } /** - * 获得类与转换器生成的key + * 获得类与转换器生成的key在{@link BeanCopier}的Map中对应的元素 * - * @param srcClass 源Bean的类 - * @param targetClass 目标Bean的类 - * @param converter 转换器 + * @param srcClass 源Bean的类 + * @param targetClass 目标Bean的类 + * @param useConverter 是否使用转换器 + * @return Map中对应的BeanCopier + * @since 5.8.0 + */ + public BeanCopier get(Class srcClass, Class targetClass, boolean useConverter) { + final String key = genKey(srcClass, targetClass, useConverter); + return cache.get(key, () -> BeanCopier.create(srcClass, targetClass, useConverter)); + } + + /** + * 获得类与转换器生成的key
+ * 结构类似于:srcClassName#targetClassName#1 或者 srcClassName#targetClassName#0 + * + * @param srcClass 源Bean的类 + * @param targetClass 目标Bean的类 + * @param useConverter 是否使用转换器 * @return 属性名和Map映射的key */ - private String genKey(Class srcClass, Class targetClass, Converter converter) { + private String genKey(Class srcClass, Class targetClass, boolean useConverter) { final StringBuilder key = StrUtil.builder() - .append(srcClass.getName()).append('#').append(targetClass.getName()); - if(null != converter){ - key.append('#').append(converter.getClass().getName()); - } + .append(srcClass.getName()) + .append('#').append(targetClass.getName()) + .append('#').append(useConverter ? 1 : 0); return key.toString(); } } diff --git a/hutool-extra/src/test/java/cn/hutool/extra/cglib/CglibUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/cglib/CglibUtilTest.java index 70a499ac9..df8662378 100644 --- a/hutool-extra/src/test/java/cn/hutool/extra/cglib/CglibUtilTest.java +++ b/hutool-extra/src/test/java/cn/hutool/extra/cglib/CglibUtilTest.java @@ -1,5 +1,6 @@ package cn.hutool.extra.cglib; +import cn.hutool.core.convert.Convert; import lombok.Data; import org.junit.Assert; import org.junit.Test; @@ -9,23 +10,36 @@ public class CglibUtilTest { @Test public void copyTest() { SampleBean bean = new SampleBean(); - bean.setValue("Hello world"); - OtherSampleBean otherBean = new OtherSampleBean(); + bean.setValue("Hello world"); + bean.setValue2("123"); + CglibUtil.copy(bean, otherBean); Assert.assertEquals("Hello world", otherBean.getValue()); + // 无定义转换器,转换失败 + Assert.assertEquals(0, otherBean.getValue2()); OtherSampleBean otherBean2 = CglibUtil.copy(bean, OtherSampleBean.class); Assert.assertEquals("Hello world", otherBean2.getValue()); + // 无定义转换器,转换失败 + Assert.assertEquals(0, otherBean.getValue2()); + + otherBean = new OtherSampleBean(); + //自定义转换器 + CglibUtil.copy(bean, otherBean, (value, target, context) -> Convert.convertQuietly(target, value)); + Assert.assertEquals("Hello world", otherBean.getValue()); + Assert.assertEquals(123, otherBean.getValue2()); } @Data public static class SampleBean { private String value; + private String value2; } @Data public static class OtherSampleBean { private String value; + private int value2; } }