Advertisement
nimchimpsky

Generate random data, depends on Spring ReflectionUtils

Aug 10th, 2013
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.33 KB | None | 0 0
  1. public class RandomDataFactory {
  2.  
  3.     private static final String UNGENERATED_VALUE_MARKER = "UNGENERATED_VALUE_MARKER";
  4.  
  5.     private static void randomlyPopulateFields(Object object) {
  6.         new RandomValueFieldPopulator().populate(object);
  7.     }
  8.  
  9.     /**
  10.      * Instantiates a single object with random data
  11.      */
  12.     public static <T> T getSingle(Class<T> clazz) throws IllegalAccessException, InstantiationException {
  13.         T object = clazz.newInstance();
  14.         randomlyPopulateFields(object);
  15.         return object;
  16.     }
  17.  
  18.     /**
  19.      * Returns an unmodifiable list of specified type objects with random data
  20.      *
  21.      * @param clazz     the myPojo.class to be instantiated with random data
  22.      * @param maxLength the length of list to be returned
  23.      */
  24.     public static <T> List<T> getList(Class<T> clazz, int maxLength) throws IllegalAccessException, InstantiationException {
  25.         List<T> list = new ArrayList<T>(maxLength);
  26.         for (int i = 0; i < maxLength; i++) {
  27.             T object = clazz.newInstance();
  28.             randomlyPopulateFields(object);
  29.             list.add(i, object);
  30.         }
  31.         return Collections.unmodifiableList(list);
  32.     }
  33.  
  34.     /**
  35.      * Returns a unmodifiable list of specified type T objects with random data
  36.      * <p>List length will be 3</p>
  37.      *
  38.      * @param clazz the myPojo.class to be instantiated with random data
  39.      */
  40.     public static <T> List<T> getList(Class<T> clazz) throws InstantiationException, IllegalAccessException {
  41.         return getList(clazz, 3);
  42.     }
  43.  
  44.     public static <T> T getPrimitive(Class<T> clazz) {
  45.         return (T) RandomValueFieldPopulator.generateRandomValue(clazz);
  46.     }
  47.  
  48.     public static <T> List<T> getPrimitiveList(Class<T> clazz) {
  49.         return getPrimitiveList(clazz, 3);
  50.     }
  51.  
  52.     public static <T> List<T> getPrimitiveList(Class<T> clazz, int length) {
  53.         List<T> randoms = new ArrayList<T>(length);
  54.         for (int i = 0; i < length; i++) {
  55.             randoms.add(getPrimitive(clazz));
  56.         }
  57.         return randoms;
  58.     }
  59.  
  60.     private static class RandomValueFieldPopulator {
  61.         public static Object generateRandomValue(Class<?> fieldType) {
  62.             Random random = new Random();
  63.               if (fieldType.equals(String.class)) {
  64.                 return UUID.randomUUID().toString();
  65.             } else if (Date.class.isAssignableFrom(fieldType)) {
  66.                 return new Date(System.currentTimeMillis() - random.nextInt());
  67.             } else if (LocalDate.class.isAssignableFrom(fieldType)) {
  68.                 Date date = new Date(System.currentTimeMillis() - random.nextInt());
  69.                 return new LocalDate(date);
  70.             } else if (fieldType.equals(Character.class) || fieldType.equals(Character.TYPE)) {
  71.                 return (char) (random.nextInt(26) + 'a');
  72.             } else if (fieldType.equals(Integer.TYPE) || fieldType.equals(Integer.class)) {
  73.                 return random.nextInt();
  74.             } else if (fieldType.equals(Short.TYPE) || fieldType.equals(Short.class)) {
  75.                 return (short) random.nextInt();
  76.             } else if (fieldType.equals(Long.TYPE) || fieldType.equals(Long.class)) {
  77.                 return random.nextLong();
  78.             } else if (fieldType.equals(Float.TYPE) || fieldType.equals(Float.class)) {
  79.                 return random.nextFloat();
  80.             } else if (fieldType.equals(Double.TYPE)) {
  81.                 return random.nextInt(); //if double is used, jsonPath uses bigdecimal to convert back
  82.             } else if (fieldType.equals(Double.class)) {
  83.                 return random.nextDouble(); //if double is used, jsonPath uses bigdecimal to convert back
  84.             } else if (fieldType.equals(Boolean.TYPE) || fieldType.equals(Boolean.class)) {
  85.                 return random.nextBoolean();
  86.             } else if (fieldType.equals(BigDecimal.class)) {
  87.                 return new BigDecimal(random.nextFloat());
  88.             } else if (Enum.class.isAssignableFrom(fieldType)) {
  89.                 Object[] enumValues = fieldType.getEnumConstants();
  90.                 return enumValues[random.nextInt(enumValues.length)];
  91.             } else if (Number.class.isAssignableFrom(fieldType)) {
  92.                 return random.nextInt(Byte.MAX_VALUE) + 1;
  93.             } else {
  94.                 return UNGENERATED_VALUE_MARKER;
  95.             }
  96.  
  97.         public void populate(Object object) {
  98.             ReflectionUtils.doWithFields(object.getClass(), new RandomValueFieldSetterCallback(object));
  99.         }
  100.  
  101.         private static class RandomValueFieldSetterCallback implements ReflectionUtils.FieldCallback {
  102.             private final Object targetObject;
  103.  
  104.             public RandomValueFieldSetterCallback(Object targetObject) {
  105.                 this.targetObject = targetObject;
  106.             }
  107.  
  108.             @Override
  109.             public void doWith(Field field) throws IllegalAccessException {
  110.                 Class<?> fieldType = field.getType();
  111.                 if (!Modifier.isFinal(field.getModifiers())) {
  112.                     Object value = generateRandomValue(fieldType);
  113.                     if (!value.equals(UNGENERATED_VALUE_MARKER)) {
  114.                         ReflectionUtils.makeAccessible(field);
  115.                         field.set(targetObject, value);
  116.                     }
  117.                 }
  118.             }
  119.         }
  120.     }
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement