Seit dem 15. November 2020 befindet sich Easy Random im Wartungsmodus. Das bedeutet, dass von nun an nur noch Fehlerbehebungen angegangen werden (mit Ausnahme der Datensatzunterstützung, die mit der Veröffentlichung von Java 16 veröffentlicht wird). Version 5.0.x (basierend auf Java 11) und Version 4.3.x (basierend auf Java 8) sind derzeit die einzigen unterstützten Versionen. Bitte erwägen Sie baldmöglichst ein Upgrade auf eine dieser Versionen.
Easy Random ist eine Bibliothek, die zufällige Java-Objekte generiert. Sie können es sich als ObjectMother für die JVM vorstellen. Nehmen wir an, Sie haben eine Klasse Person
und möchten eine zufällige Instanz davon generieren. Dann geht es los:
EasyRandom easyRandom = new EasyRandom ();
Person person = easyRandom . nextObject ( Person . class );
Die Methode EasyRandom#nextObject
ist in der Lage, zufällige Instanzen eines beliebigen Typs zu generieren.
Die java.util.Random
API bietet 7 Methoden zum Generieren von Zufallsdaten: nextInt()
, nextLong()
, nextDouble()
, nextFloat()
, nextBytes()
, nextBoolean()
und nextGaussian()
. Was ist, wenn Sie einen zufälligen String
generieren müssen? Oder sagen wir eine zufällige Instanz Ihres Domänenobjekts? Easy Random stellt die EasyRandom
-API bereit, die java.util.Random
um eine Methode namens nextObject(Class type)
erweitert. Diese Methode ist in der Lage, eine zufällige Instanz einer beliebigen Java-Bean zu generieren.
Die EasyRandomParameters
-Klasse ist der Haupteinstiegspunkt zum Konfigurieren EasyRandom
Instanzen. Sie können alle Parameter festlegen, um zu steuern, wie Zufallsdaten generiert werden:
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 );
Weitere Einzelheiten zu diesen Parametern finden Sie im Abschnitt „Konfigurationsparameter“.
In den meisten Fällen reichen Standardoptionen aus und Sie können den Standardkonstruktor von EasyRandom
verwenden.
Mit Easy Random können Sie steuern, wie Zufallsdaten über die Schnittstelle org.jeasy.random.api.Randomizer
generiert werden, und es einfach machen, einige Felder mithilfe eines java.util.function.Predicate
aus dem Objektdiagramm auszuschließen:
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 );
Im vorherigen Beispiel wird Easy Random:
String
auf foo
(unter Verwendung des als Lambda-Ausdruck definierten Randomizer
).age
vom Typ Integer
in der Klasse Person
aus. Die statischen Methoden named
, ofType
und inClass
sind in org.jeasy.random.FieldPredicates
definiert, das allgemeine Prädikate bereitstellt, die Sie in Kombination verwenden können, um genau zu definieren, welche Felder ausgeschlossen werden sollen. Eine ähnliche Klasse namens TypePredicates
kann verwendet werden, um zu definieren, welche Typen aus dem Objektdiagramm ausgeschlossen werden sollen. Sie können natürlich Ihr eigenes java.util.function.Predicate
in Kombination mit diesen vordefinierten Prädikaten verwenden.
Das Füllen eines Java-Objekts mit Zufallsdaten kann auf den ersten Blick einfach aussehen, es sei denn, Ihr Domänenmodell umfasst viele verwandte Klassen. Nehmen wir im vorherigen Beispiel an, dass der Typ Person
wie folgt definiert ist:
Ohne Easy Random würden Sie den folgenden Code schreiben, um eine Instanz der Person
-Klasse zu erstellen:
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 );
Und wenn diese Klassen Konstruktoren keine Parameter zur Verfügung stellen (möglicherweise handelt es sich um einige ältere Typen, die Sie nicht ändern können), würden Sie schreiben:
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 );
Bei Easy Random erfolgt die Generierung eines zufälligen Person
mit new EasyRandom().nextObject(Person.class)
. Die Bibliothek füllt rekursiv den gesamten Objektgraphen. Das ist ein großer Unterschied!
Manchmal ist das Testgerät für die Testlogik nicht wirklich wichtig. Wenn wir beispielsweise das Ergebnis eines neuen Sortieralgorithmus testen möchten, können wir zufällige Eingabedaten generieren und behaupten, dass die Ausgabe unabhängig von den Daten selbst sortiert ist:
@ 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
}
Ein weiteres Beispiel ist das Testen der Persistenz eines Domänenobjekts. Wir können ein zufälliges Domänenobjekt generieren, es beibehalten und behaupten, dass die Datenbank dieselben Werte enthält:
@ 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
}
Es gibt viele andere Anwendungsfälle, in denen Easy Random nützlich sein kann. Eine nicht erschöpfende Liste finden Sie im Wiki.
Sie können gerne mit Pull-Requests auf GitHub zum Projekt beitragen. Bitte beachten Sie, dass sich Easy Random im Wartungsmodus befindet, was bedeutet, dass nur Pull-Requests für Fehlerbehebungen berücksichtigt werden.
Wenn Sie glauben, einen Fehler gefunden zu haben oder Fragen haben, verwenden Sie bitte den Issue-Tracker.
Vielen Dank an alle für eure Beiträge!
Die MIT-Lizenz. Siehe LICENSE.txt.