首页 > 其他分享 >单测 填充测试pojo工具类

单测 填充测试pojo工具类

时间:2024-04-16 19:55:35浏览次数:13  
标签:obj 填充 pojo clazz field fieldType 单测 else class

直接上


import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.ReflectUtil;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.*;
import java.util.*;

/**
 * description 填充属性
 *
 * @author xuhb
 * @since 2024-04-07
 **/
@Slf4j
public class FillTestValueUtils {

    public static <T> void initializeFieldsShallow(T obj) {
        initializeFields(obj, false);
    }

    public static <T> void initializeFields(T obj, boolean isDeeply) {
        Class<?> clazz = obj.getClass();
        int modifiers = clazz.getModifiers();
        boolean isFinal = Modifier.isFinal(modifiers);
        if (isFinal) {
            return;
        }
        Field[] fields = ReflectUtil.getFields(clazz);
        for (Field field : fields) {
            field.setAccessible(true);
            Class<?> fieldType = field.getType();
            Object value = null;
            try {
                value = field.get(obj);
            } catch (IllegalAccessException e) {
                log.error("获取变量错误", e);
            }
            if (fieldType == String.class) {
                if (value != null && !"".equals(value)) {
                    continue;
                }
            }else if (fieldType == List.class) {
                if (value != null&&! ((List<?>)value).isEmpty()) {
                    continue;
                }
            } else if (value != null) {
                continue;
            }

            if (isPrimitiveOrWrapper(fieldType)) {
                if (fieldType == int.class || fieldType == Integer.class) {
                    try {
                        field.set(obj, RandomUtil.randomInt());
                    } catch (IllegalAccessException e) {
                        log.error("赋值错误", e);
                    }
                } else if (fieldType == long.class || fieldType == Long.class) {
                    try {
                        field.set(obj, RandomUtil.randomLong(1, 50000));
                    } catch (IllegalAccessException e) {
                        log.error("赋值错误", e);
                    }
                } else if (fieldType == double.class || fieldType == Double.class) {
                    try {
                        field.set(obj, RandomUtil.randomDouble(1, 50000));
                    } catch (IllegalAccessException e) {
                        log.error("赋值错误", e);
                    }
                } else if (fieldType == float.class || fieldType == Float.class) {
                    try {
                        field.set(obj, RandomUtil.randomInt(1, 50000));
                    } catch (IllegalAccessException e) {
                        log.error("赋值错误", e);
                    }
                } else if (fieldType == boolean.class || fieldType == Boolean.class) {
                    try {
                        field.set(obj, true);
                    } catch (IllegalAccessException e) {
                        log.error("赋值错误", e);
                    }
                } else if (fieldType == byte.class || fieldType == Byte.class) {
                    try {
                        field.set(obj, (byte) RandomUtil.randomInt(1, 100));
                    } catch (IllegalAccessException e) {
                        log.error("赋值错误", e);
                    }
                } else {
                    log.info("此字段未配置:{},{}", field.getName(), fieldType);
                }
            } else if (fieldType == String.class) {
                try {
                    if (field.getName().contains("Id") || field.getName().contains("id")) {
                        field.set(obj, String.valueOf(RandomUtil.randomInt(1, 50000)));
                    } else {
                        field.set(obj, RandomUtil.randomString(5));
                    }

                } catch (IllegalAccessException e) {
                    log.error("赋值错误", e);
                }
            } else if (fieldType == Date.class) {
                try {

                    field.set(obj, new DateTime("2024-01-01"));
                } catch (IllegalAccessException e) {
                    log.error("赋值错误", e);
                }
            } else if (fieldType == List.class) {
                if (isDeeply){
                    try {
                        Type genericType = field.getGenericType();
                        if (genericType instanceof ParameterizedType) {
                            ParameterizedType type = (ParameterizedType) genericType;
                            Type[] typeArguments = type.getActualTypeArguments();
                            for (Type typeArgument : typeArguments) {
                                Class<?> typeArgClass = (Class<?>) typeArgument;
                                List<?> pojoList;
                                if (typeArgClass.getName().contains("Id") || typeArgClass.getName().contains("id")) {
                                    pojoList = getPojoList(typeArgClass, 2, true);
                                } else {
                                    pojoList = getPojoList(typeArgClass, 2);
                                }

                                field.set(obj, pojoList);
                            }
                        } else {
                            field.set(obj, Collections.emptyList());
                        }

                    } catch (IllegalAccessException e) {
                        log.error("赋值错误", e);
                    }
                }else {
                    try {
                        field.set(obj, Collections.emptyList());
                    } catch (IllegalAccessException e) {
                        log.error("赋值错误", e);
                    }
                }
            } else if (fieldType == Map.class) {
                try {
                    field.set(obj, Collections.emptyMap());
                } catch (IllegalAccessException e) {
                    log.error("赋值错误", e);
                }
            } else if (fieldType == Set.class) {
                try {
                    field.set(obj, Collections.emptySet());
                } catch (IllegalAccessException e) {
                    log.error("赋值错误", e);
                }
            } else if (fieldType == Enum.class) {
                log.info("此值为枚举{}", fieldType.getName());
            } else if (fieldType == Collection.class) {
                log.info("此值为集合{}", fieldType.getName());
            } else if (hasNoArgConstructor(fieldType)) {
                try {
                    Object o = fieldType.newInstance();
                    if (isDeeply){
                        initializeFields(o);
                    }
                    field.set(obj, o);
                } catch (IllegalAccessException | InstantiationException e) {
                    log.error("赋值错误", e);
                }
            }

        }
    }

    public static void initializeFields(Object... obj) {
        for (Object o : obj) {
            initializeFields(o);
        }
    }

    public static <T> void initializeFields(T obj) {
        initializeFields(obj, true);
    }

    public static <E> List<E> getPojoList(Class<E> clazz, int size) {
        return getPojoList(clazz, size, false, true);
    }

    public static <E> List<E> getPojoListShallow(Class<E> clazz, int size) {
        return getPojoList(clazz, size, false, false);
    }

    public static <E> List<E> getPojoList(Class<E> clazz, int size, boolean isNumberString) {
        return getPojoList(clazz, size, isNumberString, true);
    }

    public static <E> List<E> getPojoList(Class<E> clazz, int size, boolean isNumberString, boolean isDeeply) {
        List<E> list = Lists.newArrayList();
        for (int i = 0; i < size; i++) {
            E e = null;
            try {
                if (isPrimitiveOrWrapperNumber(clazz)) {
                    if (clazz == int.class || clazz == Integer.class) {
                        Integer i1 = RandomUtil.randomInt(1, 500);
                        e = (E) i1;
                    } else if (clazz == long.class || clazz == Long.class) {
                        Long i1 = RandomUtil.randomLong(1, 500);
                        e = (E) i1;
                    } else if (clazz == double.class || clazz == Double.class) {
                        Double i1 = RandomUtil.randomDouble(1, 500);
                        e = (E) i1;
                    } else if (clazz == float.class || clazz == Float.class) {
                        Float i1 = (float) RandomUtil.randomInt(1, 500);
                        e = (E) i1;
                    } else if (clazz == byte.class || clazz == Byte.class) {
                        Byte i1 = (byte) RandomUtil.randomInt(1, 100);
                        e = (E) i1;
                    }
                } else if (clazz == String.class) {
                    String a;
                    if (isNumberString) {
                        a = String.valueOf(RandomUtil.randomInt(0,500));
                    } else {
                        a = RandomUtil.randomString(5);
                    }
                    e = (E) a;
                } else if (hasNoArgConstructor(clazz)) {
                    e = clazz.newInstance();
                    if (isDeeply){
                        initializeFields(e);
                    }
                }
                if (e != null) {
                    list.add(e);
                }

            } catch (InstantiationException | IllegalAccessException ex) {
                log.error("赋值错误", ex);
            }

        }
        return list;
    }

    private static boolean isPrimitiveOrWrapper(Class<?> clazz) {
        return clazz == int.class || clazz == Integer.class ||
                clazz == long.class || clazz == Long.class ||
                clazz == double.class || clazz == Double.class ||
                clazz == float.class || clazz == Float.class ||
                clazz == boolean.class || clazz == Boolean.class ||
                clazz == byte.class || clazz == Byte.class ||
                clazz == char.class || clazz == Character.class ||
                clazz == short.class || clazz == Short.class;
    }

    private static boolean isPrimitiveOrWrapperNumber(Class<?> clazz) {
        return clazz == int.class || clazz == Integer.class ||
                clazz == long.class || clazz == Long.class ||
                clazz == double.class || clazz == Double.class ||
                clazz == float.class || clazz == Float.class ||
                clazz == byte.class || clazz == Byte.class ||
                clazz == short.class || clazz == Short.class;
    }

    public static boolean hasNoArgConstructor(Class<?> clazz) {
        try {
            // 尝试获取无参构造器
            Constructor<?> constructor = clazz.getDeclaredConstructor();
            if (!constructor.isAccessible()) {
                constructor.setAccessible(true);
            }
            return true;
        } catch (NoSuchMethodException e) {
            return false;
        }
    }
}

标签:obj,填充,pojo,clazz,field,fieldType,单测,else,class
From: https://www.cnblogs.com/funkboy/p/18139052

相关文章

  • echarts 两个曲线之间填充并且不遮挡的办法
    echarts两个曲线之间填充可以用两条曲线,第一条填充白色,然后第2条填充想要的颜色,如下面的代码option={title:{text:'堆叠区域图'},tooltip:{trigger:'axis'},legend:{data:['最小值','最大值']},too......
  • Godot Label样式 Textrue纹理,实现样式修改,背景填充
    目录前言运行环境新建项目Style样式讲解StyleBoxEmpty:普通样式StyleBoxTexture:字体样式StyleBoxFlat:填充样式StyleBoxLine:行样式总结前言在Godot中,直接的BackGroud背景颜色这个属性。Godot中使用的是Textrue纹理这个属性来表示文本的信息运行环境Godot4.2.1Windows10......
  • 后端开发之SpringBootWeb入门介绍及简单测试 2024详解
    SpringBoot介绍官网spring.ioSpring是最流行的Java框架Spring发展到今天已经形成了一种开发生态圈Spring提供了若干个子项目每个项目用于完成特定的功能企业开发框架之间的整合会很容易所以我们选择Spring全家桶基于基础的SpringFramework框架但是配置繁琐入门......
  • [SVG]修改固定颜色为填充颜色
    主要思路是把fill和stroke改成currentColor,具体以后补充。 修改之前:<svgxmlns="http://www.w3.org/2000/svg"viewBox="003636"><gtransform="translate(11)"fill="none"fill-rule="evenodd"><rect......
  • SM3填充
    SM3填充本次作业分值15分|老师评分 任务详情0.在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务1.使用OpenSSL的命令计算一个小于2048的随机数len,并生成长度为len的一个随机数r,提交截图(5')2.按照SM3的算法要求对r进行填充,提交详细过程和截图。(10’)......
  • Opencv实现边界填充、两个图片像素直接相加后超过255的处理方式(阈值处理方式),一个窗口
     opencv两个图片直接相加,会直接相加,如果超过255,会取模。 print((img_cat+img_cat2)[:5,:,0])#0-255若相加越界后294用294%256获得余数38可以使用这种方式查看。展示的是前5行,所有列的第一个通道的值。还有一种方法是cv2.add(),这个方法会直接将超过255的值设置为25......
  • 使用POI填充Word文档,一些注意事项以及解决办法
    有这样一个需求:需要将用户输入的数据填写到准备好的Word模版中并提供下载,最终选择POI-tl和POI来完成上述需求。在这个过程中,主要遇到了以下两个问题:1.Word的两个格式doc和docx(两种文件的区别大家可以自行百度了解下),POI并没有提供统一的处理类。分别用HWPFDocument处理doc......
  • 全能Office插件——不坑盒子,自动排版、阅读模式、Word中表格填充序号、发票读取、绿膜
    不坑盒子2024.0404版,带着21项变动,来了~本文可能略长,还有很多视频和动图,请一定要耐心看完;或许,真的能改变你的工作方式。自动排版2024(Word)自去年“新自动排版”上线后,一定饱受争议,有人骂它太卡、匹配不完美;有人夸它灵活、更自由。核心变化这个版本“自动排版”功能的核心已......
  • php采用aes算法,字符编码utf8,填充模式ECB,填充:ZeroPadding,编码:base64,实现加密
    原文:https://blog.csdn.net/yinxinyue0621/article/details/129813334一、php:三种填充模式的区别(PKCS7Padding/PKCS5Padding/ZeroPadding)(一)常见的三种填充方式:我们知道某些加密算法要求明文需要按一定长度对齐,叫做块大小(BlockSize),比如16字节,那么对于一段任意的数据,加密前需要......
  • C# 适配 Maspter 不覆盖填充值
    publicstaticclassMapExtension{publicstaticvoidFill(thisobjectsrc,objectdest){if(src==null||dest==null)return;varsrcType=src.GetType();vardestType=dest.GetType();varproper......