Em 15 de novembro de 2020, Easy Random está em modo de manutenção. Isso significa que apenas correções de bugs serão abordadas de agora em diante (exceto para suporte a registros que será lançado quando o Java 16 for lançado). A versão 5.0.x (baseada em Java 11) e a versão 4.3.x (baseada em Java 8) são as únicas versões suportadas por enquanto. Considere atualizar para uma dessas versões o mais rápido possível.
Easy Random é uma biblioteca que gera objetos Java aleatórios. Você pode pensar nisso como um ObjectMother para a JVM. Digamos que você tenha uma classe Person
e queira gerar uma instância aleatória dela, vamos lá:
EasyRandom easyRandom = new EasyRandom ();
Person person = easyRandom . nextObject ( Person . class );
O método EasyRandom#nextObject
é capaz de gerar instâncias aleatórias de qualquer tipo.
A API java.util.Random
fornece 7 métodos para gerar dados aleatórios: nextInt()
, nextLong()
, nextDouble()
, nextFloat()
, nextBytes()
, nextBoolean()
e nextGaussian()
. E se você precisar gerar uma String
aleatória? Ou digamos, uma instância aleatória do seu objeto de domínio? Easy Random fornece a API EasyRandom
que estende java.util.Random
com um método chamado nextObject(Class type)
. Este método é capaz de gerar uma instância aleatória de qualquer Java bean arbitrário.
A classe EasyRandomParameters
é o principal ponto de entrada para configurar instâncias EasyRandom
. Ele permite que você defina todos os parâmetros para controlar como os dados aleatórios são gerados:
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 obter mais detalhes sobre esses parâmetros, consulte a seção de parâmetros de configuração.
Na maioria dos casos, as opções padrão são suficientes e você pode usar o construtor padrão EasyRandom
.
Easy Random permite controlar como gerar dados aleatórios por meio da interface org.jeasy.random.api.Randomizer
e facilita a exclusão de alguns campos do gráfico do objeto usando um 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 );
No exemplo anterior, Easy Random irá:
String
como foo
(usando o Randomizer
definido como uma expressão lambda)age
do tipo Integer
na classe Person
. Os métodos estáticos named
ofType
e inClass
são definidos em org.jeasy.random.FieldPredicates
que fornece predicados comuns que você pode usar em combinação para definir exatamente quais campos excluir. Uma classe semelhante chamada TypePredicates
pode ser usada para definir quais tipos excluir do gráfico do objeto. É claro que você pode usar seu próprio java.util.function.Predicate
em combinação com esses predicados predefinidos.
Preencher um objeto Java com dados aleatórios pode parecer fácil à primeira vista, a menos que seu modelo de domínio envolva muitas classes relacionadas. No exemplo anterior, vamos supor que o tipo Person
seja definido da seguinte forma:
Sem o Easy Random, você escreveria o seguinte código para criar uma instância da 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 );
E se essas classes não fornecem parâmetros aos construtores (podem ser alguns tipos legados que você não pode alterar), você escreveria:
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 );
Com Easy Random, a geração de um objeto Person
aleatório é feita com new EasyRandom().nextObject(Person.class)
. A biblioteca preencherá recursivamente todo o gráfico do objeto. Essa é uma grande diferença!
Às vezes, o acessório de teste realmente não importa para a lógica do teste. Por exemplo, se quisermos testar o resultado de um novo algoritmo de classificação, podemos gerar dados de entrada aleatórios e afirmar que a saída está classificada, independentemente dos dados em si:
@ 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
}
Outro exemplo é testar a persistência de um objeto de domínio, podemos gerar um objeto de domínio aleatório, persisti-lo e afirmar que o banco de dados contém os mesmos 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
}
Existem muitos outros casos de uso em que o Easy Random pode ser útil. Você pode encontrar uma lista não exaustiva no wiki.
Você está convidado a contribuir com o projeto com solicitações pull no GitHub. Observe que o Easy Random está em modo de manutenção, o que significa que apenas solicitações pull para correção de bugs serão consideradas.
Se você acredita que encontrou um bug ou tem alguma dúvida, use o rastreador de problemas.
Obrigado a todos por suas contribuições!
A licença do MIT. Consulte LICENSE.txt.