A partir del 15 de noviembre de 2020, Easy Random se encuentra en modo de mantenimiento. Esto significa que de ahora en adelante solo se corregirán errores (excepto la compatibilidad con registros que se lanzará cuando Java 16 esté disponible). La versión 5.0.x (basada en Java 11) y la versión 4.3.x (basada en Java 8) son las únicas versiones compatibles por ahora. Considere actualizar a una de estas versiones lo antes posible.
Easy Random es una biblioteca que genera objetos Java aleatorios. Puedes considerarlo como un ObjectMother para la JVM. Digamos que tienes una clase Person
y quieres generar una instancia aleatoria de ella, aquí vamos:
EasyRandom easyRandom = new EasyRandom ();
Person person = easyRandom . nextObject ( Person . class );
El método EasyRandom#nextObject
es capaz de generar instancias aleatorias de cualquier tipo determinado.
La API java.util.Random
proporciona 7 métodos para generar datos aleatorios: nextInt()
, nextLong()
, nextDouble()
, nextFloat()
, nextBytes()
, nextBoolean()
y nextGaussian()
. ¿Qué pasa si necesitas generar una String
aleatoria? ¿O decir una instancia aleatoria de su objeto de dominio? Easy Random proporciona la API EasyRandom
que extiende java.util.Random
con un método llamado nextObject(Class type)
. Este método es capaz de generar una instancia aleatoria de cualquier bean Java arbitrario.
La clase EasyRandomParameters
es el principal punto de entrada para configurar instancias EasyRandom
. Le permite configurar todos los parámetros para controlar cómo se generan los datos aleatorios:
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 );
Para obtener más detalles sobre estos parámetros, consulte la sección de parámetros de configuración.
En la mayoría de los casos, las opciones predeterminadas son suficientes y puedes usar el constructor predeterminado de EasyRandom
.
Easy Random le permite controlar cómo generar datos aleatorios a través de la interfaz org.jeasy.random.api.Randomizer
y facilita la exclusión de algunos campos del gráfico de objetos usando 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 );
En el ejemplo anterior, Easy Random:
String
en foo
(usando el Randomizer
definido como una expresión lambda)age
de tipo Integer
en la clase Person
. Los métodos estáticos named
, ofType
e inClass
se definen en org.jeasy.random.FieldPredicates
, que proporciona predicados comunes que puede usar en combinación para definir exactamente qué campos excluir. Se puede utilizar una clase similar llamada TypePredicates
para definir qué tipos excluir del gráfico de objetos. Por supuesto, puede utilizar su propio java.util.function.Predicate
en combinación con esos predicados predefinidos.
Completar un objeto Java con datos aleatorios puede parecer fácil a primera vista, a menos que su modelo de dominio involucre muchas clases relacionadas. En el ejemplo anterior, supongamos que el tipo Person
se define de la siguiente manera:
Sin Easy Random, escribirías el siguiente código para crear una instancia de la clase 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 );
Y si estas clases no proporcionan parámetros a los constructores (pueden haber algunos tipos heredados que no se pueden cambiar), escribiría:
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 );
Con Easy Random, la generación de un objeto Person
aleatorio se realiza con new EasyRandom().nextObject(Person.class)
. La biblioteca completará recursivamente todo el gráfico de objetos. ¡Esa es una gran diferencia!
A veces, el dispositivo de prueba realmente no importa para la lógica de prueba. Por ejemplo, si queremos probar el resultado de un nuevo algoritmo de clasificación, podemos generar datos de entrada aleatorios y afirmar que la salida está ordenada, independientemente de los datos en sí:
@ 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
}
Otro ejemplo es probar la persistencia de un objeto de dominio, podemos generar un objeto de dominio aleatorio, persistirlo y afirmar que la base de datos contiene los mismos valores:
@ 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
}
Hay muchos otros casos de uso en los que Easy Random puede resultar útil; puede encontrar una lista no exhaustiva en la wiki.
Le invitamos a contribuir al proyecto con solicitudes de extracción en GitHub. Tenga en cuenta que Easy Random está en modo de mantenimiento, lo que significa que solo se considerarán las solicitudes de extracción para corregir errores.
Si cree que encontró un error o tiene alguna pregunta, utilice el rastreador de problemas.
¡Gracias a todos por sus contribuciones!
La licencia MIT. Consulte LICENCIA.txt.