Instancio is a Java library that automatically creates and populates objects for your unit tests.
Instead of manually setting up test data:
Address address = new Address();
address.setStreet("street");
address.setCity("city");
//...
Person person = new Person();
person.setFirstName("first-name");
person.setLastName("last-name");
person.setAge(22);
person.setGender(Gender.MALE);
person.setAddress(address);
//...
You can simply do the following:
Person person = Instancio.create(Person.class);
This one-liner returns a fully-populated person, including nested objects and collections.
The object is populated with random data that can be reproduced in case of test failure.
- Create collections of objects:
List<Person> persons = Instancio.ofList(Person.class).size(10).create();
- Create streams of objects:
Stream<Person> persons = Instancio.stream(Person.class).limit(5);
- Create generic types:
Pair<List<Foo>, List<Bar>> pairOfLists = Instancio.create(new TypeToken<Pair<List<Foo>, List<Bar>>>() {});
- Customise generated values:
Person person = Instancio.of(Person.class)
.generate(field(Person::getDateOfBirth), gen -> gen.temporal().localDate().past())
.generate(field(Phone::getAreaCode), gen -> gen.oneOf("604", "778"))
.generate(field(Phone::getNumber), gen -> gen.text().pattern("#d#d#d-#d#d-#d#d"))
.subtype(all(AbstractAddress.class), AddressImpl.class)
.supply(all(LocalDateTime.class), () -> LocalDateTime.now())
.onComplete(all(Person.class), (Person p) -> p.setName(p.getGender() == Gender.MALE ? "John" : "Jane"))
.create();
- Create reusable templates (Models) of objects:
Model<Person> simpsons = Instancio.of(Person.class)
.set(field(Person::getLastName), "Simpson")
.set(field(Address::getCity), "Springfield")
.generate(field(Person::getAge), gen -> gen.ints().range(40, 50))
.toModel();
Person homer = Instancio.of(simpsons)
.set(field(Person::getFirstName), "Homer")
.set(all(Gender.class), Gender.MALE)
.create();
Person marge = Instancio.of(simpsons)
.set(field(Person::getFirstName), "Marge")
.set(all(Gender.class), Gender.FEMALE)
.create();
- Fully reproducible data in case of test failures.
- Support for generics,
record
andsealed
classes. - Support for defining custom generators.
- Support for generating data based on Bean Validation annotations.
- Flexible configuration options.
InstancioExtension
for Junit 5@ExtendWith
.- Support for Guava via
instancio-guava
module (experimental)
- User guide (instancio.org)
- Javadocs (javadoc.io)
Instancio Quickstart is the best way to get started. It is a sample (Maven) project that provides an overview of all the main features.
git clone https://github.com/instancio/instancio-quickstart.git
Version 3.4.1
is now available.
A summary of new features is available in the release notes.
If you have JUnit 5 on the classpath, use the instancio-junit
dependency.
<dependency>
<groupId>org.instancio</groupId>
<artifactId>instancio-junit</artifactId>
<version>3.4.1</version>
<scope>test</scope>
</dependency>
To use Instancio with JUnit 4, TestNG, or standalone, use instancio-core
:
<dependency>
<groupId>org.instancio</groupId>
<artifactId>instancio-core</artifactId>
<version>3.4.1</version>
<scope>test</scope>
</dependency>
Feedback and bug reports are greatly appreciated!
- Please submit an issue for bug reports and feature requests.
- For general feedback or questions, please create a post in the Discussions.
Please check the User Guide, previous issues and discussions before creating a new one.
- instancio-jpa created by Moritz Becker
Instancio-jpa is an extension on top of the Instancio library that enables the creation and population of JPA entities including the subsequent persistence of these entities using JPA for the purpose of test data generation in integration tests.
Thanks to JetBrains and YourKit for supporting this project with their open source licenses.