javamock生成对象

    xiaoxiao2021-03-25  84

    import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; public class Mock { private static final Boolean[] bools = new Boolean[] { true, false }; private static final char[] words = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }; private static final Random r = new Random(); private static final int MAX_COLLECTION_LENGTH = 50; private static final int MAX_STRING_LENGTH = 30; @SuppressWarnings({ "unchecked", "rawtypes" }) public static <T> T mock(Class<T> clazz) { if (clazz == Character.class || clazz == Character.TYPE) { return (T) (Character) words[r.nextInt(words.length)]; } else if (clazz == Boolean.class || clazz == Boolean.TYPE) { return (T) (Boolean) bools[r.nextInt(bools.length)]; } else if (clazz == Long.class || clazz == Long.TYPE) { return (T) (Long) r.nextLong(); } else if (clazz == Integer.class || clazz == Integer.TYPE) { return (T) (Integer) r.nextInt(); } else if (clazz == Short.class || clazz == Short.TYPE) { return (T) (Short) new Integer(r.nextInt(127)).shortValue(); } else if (clazz == Float.class || clazz == Float.TYPE) { return (T) (Float) r.nextFloat(); } else if (clazz == Double.class || clazz == Double.TYPE) { return (T) (Double) r.nextDouble(); } else if (clazz == String.class) { return (T) randString(r.nextInt(MAX_STRING_LENGTH)); } try { T instance = clazz.newInstance(); for (Field f : ReflectUtil.getFields(clazz)) { f.setAccessible(true); Length lengthAnno = f.getAnnotation(Length.class); if (f.getType() == Character.TYPE) { f.setChar(instance, words[r.nextInt(words.length)]); } else if (f.getType() == Character.class) { f.set(instance, words[r.nextInt(words.length)]); } else if (f.getType() == Boolean.TYPE) { f.setBoolean(instance, bools[r.nextInt(bools.length)]); } else if (f.getType() == Boolean.class) { f.set(instance, bools[r.nextInt(bools.length)]); } else if (f.getType() == Long.TYPE) { f.setLong(instance, r.nextLong()); } else if (f.getType() == Long.class) { f.set(instance, r.nextLong()); } else if (f.getType() == Integer.TYPE) { f.setInt(instance, r.nextInt()); } else if (f.getType() == Integer.class) { f.set(instance, r.nextInt()); } else if (f.getType() == Short.TYPE) { f.setShort(instance, new Integer(r.nextInt(127)).shortValue()); } else if (f.getType() == Short.class) { f.set(instance, new Integer(r.nextInt(127)).shortValue()); } else if (f.getType() == Float.TYPE) { f.setFloat(instance, r.nextFloat()); } else if (f.getType() == Float.class) { f.set(instance, r.nextFloat()); } else if (f.getType() == Double.TYPE) { f.setDouble(instance, r.nextDouble()); } else if (f.getType() == Double.class) { f.set(instance, r.nextDouble()); } else if (f.getType() == String.class) { f.set(instance, randString(r.nextInt(MAX_STRING_LENGTH))); } else if (f.getType() == List.class) { int size = r.nextInt(MAX_COLLECTION_LENGTH); List<Object> list = new ArrayList<Object>(size); ParameterizedType pt = null; for (int i = 0; i < size; i++) { pt = (ParameterizedType) f.getGenericType(); list.add(mock((Class) pt.getActualTypeArguments()[0])); } f.set(instance, list); } else if (f.getType() == Map.class) { int size = r.nextInt(MAX_COLLECTION_LENGTH); Map<Object, Object> map = new HashMap<Object, Object>(); ParameterizedType pt = null; for (int i = 0; i < size; i++) { pt = (ParameterizedType) f.getGenericType(); map.put(mock((Class) pt.getActualTypeArguments()[0]), mock((Class) pt.getActualTypeArguments()[1])); } f.set(instance, map); } else if (f.getType() == Date.class) { f.set(instance, new Date()); } else { f.set(instance, mock(f.getType())); } } return instance; } catch (Exception e) { throw new IllegalArgumentException(e); } } private static String randString(int count) { if (count == 0) { count = 1; } int length = words.length; char[] text = new char[count]; for (int i = 0; i < count; i++) { text[i] = words[r.nextInt(length)]; } return new String(text); } }
    转载请注明原文地址: https://ju.6miu.com/read-23989.html

    最新回复(0)