Depuis le 15 novembre 2020, Easy Random est en mode maintenance. Cela signifie que seules les corrections de bogues seront désormais résolues (à l'exception de la prise en charge des enregistrements qui sera publiée lorsque Java 16 sera disponible). La version 5.0.x (basée sur Java 11) et la version 4.3.x (basée sur Java 8) sont les seules versions prises en charge pour le moment. Veuillez envisager de passer à l'une de ces versions dès que possible.
Easy Random est une bibliothèque qui génère des objets Java aléatoires. Vous pouvez le considérer comme une ObjectMother pour la JVM. Disons que vous avez une classe Person
et que vous souhaitez en générer une instance aléatoire, c'est parti :
EasyRandom easyRandom = new EasyRandom ();
Person person = easyRandom . nextObject ( Person . class );
La méthode EasyRandom#nextObject
est capable de générer des instances aléatoires de n'importe quel type donné.
L'API java.util.Random
fournit 7 méthodes pour générer des données aléatoires : nextInt()
, nextLong()
, nextDouble()
, nextFloat()
, nextBytes()
, nextBoolean()
et nextGaussian()
. Que faire si vous devez générer une String
aléatoire ? Ou disons une instance aléatoire de votre objet de domaine ? Easy Random fournit l'API EasyRandom
qui étend java.util.Random
avec une méthode appelée nextObject(Class type)
. Cette méthode est capable de générer une instance aléatoire de n’importe quel bean Java arbitraire.
La classe EasyRandomParameters
est le point d'entrée principal pour configurer les instances EasyRandom
. Il vous permet de définir tous les paramètres pour contrôler la manière dont les données aléatoires sont générées :
EasyRandomParameters parameters = new EasyRandomParameters ()
. seed ( 123L )
. objectPoolSize ( 100 )
. randomizationDepth ( 3 )
. charset ( forName ( "UTF-8" ))
. timeRange ( nine , five )
. dateRange ( today , tomorrow )
. stringLengthRange ( 5 , 50 )
. collectionSizeRange ( 1 , 10 )
. scanClasspathForConcreteTypes ( true )
. overrideDefaultInitialization ( false )
. ignoreRandomizationErrors ( true );
EasyRandom easyRandom = new EasyRandom ( parameters );
Pour plus de détails sur ces paramètres, veuillez vous référer à la section des paramètres de configuration.
Dans la plupart des cas, les options par défaut suffisent et vous pouvez utiliser le constructeur par défaut de EasyRandom
.
Easy Random vous permet de contrôler la manière de générer des données aléatoires via l'interface org.jeasy.random.api.Randomizer
et facilite l'exclusion de certains champs du graphique d'objets à l'aide d'un java.util.function.Predicate
:
EasyRandomParameters parameters = new EasyRandomParameters ()
. randomize ( String . class , () -> "foo" )
. excludeField ( named ( "age" ). and ( ofType ( Integer . class )). and ( inClass ( Person . class )));
EasyRandom easyRandom = new EasyRandom ( parameters );
Person person = easyRandom . nextObject ( Person . class );
Dans l'exemple précédent, Easy Random va :
String
sur foo
(en utilisant le Randomizer
défini comme une expression lambda)age
de type Integer
dans la classe Person
. Les méthodes statiques named
, ofType
et inClass
sont définies dans org.jeasy.random.FieldPredicates
qui fournit des prédicats courants que vous pouvez utiliser en combinaison pour définir exactement les champs à exclure. Une classe similaire appelée TypePredicates
peut être utilisée pour définir les types à exclure du graphique d'objets. Vous pouvez bien sûr utiliser votre propre java.util.function.Predicate
en combinaison avec ces prédicats prédéfinis.
Remplir un objet Java avec des données aléatoires peut sembler facile à première vue, à moins que votre modèle de domaine n'implique de nombreuses classes associées. Dans l'exemple précédent, supposons que le type Person
soit défini comme suit :
Sans Easy Random, vous écririez le code suivant afin de créer une instance de la classe Person
:
Street street = new Street ( 12 , ( byte ) 1 , "Oxford street" );
Address address = new Address ( street , "123456" , "London" , "United Kingdom" );
Person person = new Person ( "Foo" , "Bar" , "[email protected]" , Gender . MALE , address );
Et si ces classes ne fournissent pas de paramètres aux constructeurs (il peut s'agir de certains types hérités que vous ne pouvez pas modifier), vous écririez :
Street street = new Street ();
street . setNumber ( 12 );
street . setType (( byte ) 1 );
street . setName ( "Oxford street" );
Address address = new Address ();
address . setStreet ( street );
address . setZipCode ( "123456" );
address . setCity ( "London" );
address . setCountry ( "United Kingdom" );
Person person = new Person ();
person . setFirstName ( "Foo" );
person . setLastName ( "Bar" );
person . setEmail ( "[email protected]" );
person . setGender ( Gender . MALE );
person . setAddress ( address );
Avec Easy Random, la génération d'un objet Person
aléatoire se fait avec new EasyRandom().nextObject(Person.class)
. La bibliothèque remplira de manière récursive tout le graphique d'objets. C'est une grande différence !
Parfois, le montage de test n'a pas vraiment d'importance pour la logique de test. Par exemple, si nous voulons tester le résultat d'un nouvel algorithme de tri, nous pouvons générer des données d'entrée aléatoires et affirmer que la sortie est triée, quelles que soient les données elles-mêmes :
@ org . junit . Test
public void testSortAlgorithm () {
// Given
int [] ints = easyRandom . nextObject ( int []. class );
// When
int [] sortedInts = myAwesomeSortAlgo . sort ( ints );
// Then
assertThat ( sortedInts ). isSorted (); // fake assertion
}
Un autre exemple consiste à tester la persistance d'un objet de domaine, nous pouvons générer un objet de domaine aléatoire, le conserver et affirmer que la base de données contient les mêmes valeurs :
@ org . junit . Test
public void testPersistPerson () throws Exception {
// Given
Person person = easyRandom . nextObject ( Person . class );
// When
personDao . persist ( person );
// Then
assertThat ( "person_table" ). column ( "name" ). value (). isEqualTo ( person . getName ()); // assretj db
}
Il existe de nombreux autres cas d'utilisation où Easy Random peut être utile, vous pouvez en trouver une liste non exhaustive dans le wiki.
Vous êtes invités à contribuer au projet avec des pull request sur GitHub. Veuillez noter qu'Easy Random est en mode maintenance, ce qui signifie que seules les demandes d'extraction de corrections de bogues seront prises en compte.
Si vous pensez avoir trouvé un bug ou si vous avez des questions, veuillez utiliser l'outil de suivi des problèmes.
Merci à tous pour vos contributions !
La licence MIT. Voir LICENSE.txt.