52 votes

Remplir automatiquement les propriétés primitives avec des données aléatoires ?

Existe-t-il une bibliothèque Java qui aiderait à créer des instances de classes à tester ? Celui qui examine les propriétés d'un haricot et le remplit de données aléatoires. Je recherche essentiellement l'équivalent Java d' Object Hydrator pour C#.

59voto

pk1 Points 596

Vous pouvez utiliser PoDaM :

 PodamFactory factory = new PodamFactoryImpl();
Pojo myPojo = factory.manufacturePojo(Pojo.class);

28voto

Jetez un œil à Easy Random .

Il vous permet de remplir un graphique d'objet Java avec des données aléatoires.

J'espère que ça aide.

14voto

Ryan Stewart Points 46960

Je ne connais pas de framework, mais c'est assez simple d'en écrire un vous-même. La complexité vient dans des propriétés non simples, alias des associations d'objets. Quelque chose comme ça gère les bases et puis certains :

 public static void randomlyPopulateFields(Object object) {
    new RandomValueFieldPopulator().populate(object);
}

public static class RandomValueFieldPopulator {
    public void populate(Object object) {
        ReflectionUtils.doWithFields(object.getClass(), new RandomValueFieldSetterCallback(object));
    }

    private static class RandomValueFieldSetterCallback implements FieldCallback {
        private Object targetObject;

        public RandomValueFieldSetterCallback(Object targetObject) {
            this.targetObject = targetObject;
        }

        @Override
        public void doWith(Field field) throws IllegalAccessException {
            Class<?> fieldType = field.getType();
            if (!Modifier.isFinal(field.getModifiers())) {
                Object value = generateRandomValue(fieldType, new WarnOnCantGenerateValueHandler(field));
                if (!value.equals(UNGENERATED_VALUE_MARKER)) {
                    ReflectionUtils.makeAccessible(field);
                    field.set(targetObject, value);
                }
            }
        }
    }
}

public static Object generateRandomValue(Class<?> fieldType, CantGenerateValueHandler cantGenerateValueHandler) {
    if (fieldType.equals(String.class)) {
        return UUID.randomUUID().toString();
    } else if (Date.class.isAssignableFrom(fieldType)) {
        return new Date(System.currentTimeMillis() - random.nextInt(DATE_WINDOW_MILLIS));
    } else if (Number.class.isAssignableFrom(fieldType)) {
        return random.nextInt(Byte.MAX_VALUE) + 1;
    } else if (fieldType.equals(Integer.TYPE)) {
        return random.nextInt();
    } else if (fieldType.equals(Long.TYPE)) {
        return random.nextInt();
    } else if (Enum.class.isAssignableFrom(fieldType)) {
        Object[] enumValues = fieldType.getEnumConstants();
        return enumValues[random.nextInt(enumValues.length)];
    } else {
        return cantGenerateValueHandler.handle();
    }
}

6voto

Juri Reinsalu Points 61

https://github.com/benas/random-beans a fait le travail pour moi, tandis que PoDam a échoué avec des setters "fluents" et la réponse de Ryan Stewart n'est pas complète pour le copier-coller, tout comme les références aux classes qui ne sont pas exposées ! Avec random-beans, c'est aussi simple que :

 Auction auction = EnhancedRandom.random(Auction.class);

Gradle :

 testCompile ('io.github.benas:random-beans:3.4.0')

5voto

Ronak Poriya Points 1963

Vous pouvez extraire le randomiseur pour la génération de données aléatoires. Cette bibliothèque permet de créer des données aléatoires à partir d'une classe de modèle donnée. Exécutez ci-dessous l'exemple de code.

 public class Person {

   @FirstName
   String mFirstName;

   @LastName
   String mLastName;

   @Number(min = 14,max = 25,decimals = 0)
   int age;

   @DateValue( from = "01 Jan 1990",to = "31 Dec 2002" , customFormat = "dd MMM yyyy")
   String dateOfBirth;

   @Email
   String  mEmailId;

   @StreetAddress
   public String streetAddress;

   @State
   public String state;

   //Person can have minimum 1 Phone number and maximum 3 phone number
   @Phone(country = Phone.Country.INDIA)
   @CollectionDescriptor(min = 1,max = 3) 
   List<String> phones;

}

//Generate random 100 Person(Model Class) object 
Generator<Person> generator = new Generator<>(Person.class);  
List<Person> persons = generator.generate(100);                          

Comme de nombreux générateurs de données intégrés sont accessibles à l'aide d'annotations, vous pouvez également créer un générateur de données personnalisé. Je vous suggère de consulter la documentation fournie sur la page de la bibliothèque.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X