Instancio:快速简单地创​​建完整对象的库


Instancio 是一款为单元测试自动生成和填充测试数据对象的工具。只需一行代码,它就能创建包含嵌套对象和集合在内的综合对象,从而无需手动准备测试数据。这些对象由随机数据填充,如果测试出错,这些数据可以重新生成。

据说这段代码胜过一千段文字,因此整个代码的用法如下:

您可以利用下面提供的工厂轻松生成这样一个对象:
Person person = Instancio.create(Person.class);

而不是手工做这么多:

Address address  = new Address();
address.setStreet("street");
address.setCity("city");

Person person = new Person();
person.setFirstName("first-name");
person.setLastName("last-name");
person.setAddress(address);

4.0 版进一步扩展了对边缘情况的处理,包括对方法赋值的增强,即使在没有相应字段的情况下,也能动态填充对象。这对具有动态属性的对象尤其有利。Java 21 还支持顺序集合,从而简化了数据操作。新引入的笛卡尔乘积生成 API 可帮助创建复杂的数据集。此外,还修改了 stream() 函数中状态生成器的操作,确保生成的对象彼此完全独立。

Instancio 还能做什么?
创建对象集合:
List<Person> persons = Instancio.ofList(Person.class).size(10).create();

创建对象流:
Stream<Person> persons = Instancio.stream(Person.class).limit(5);

创建泛型类型:
Pair<List<Foo>, List<Bar>> pairOfLists = Instancio.create(new TypeToken<Pair<List<Foo>, List<Bar>>>() {});

自定义生成的值:

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("ddd-dd-dd"))
    .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();

创建可重用的对象模板(模型):

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")
    .create();

Person marge = Instancio.of(simpsons)
    .set(field(Person::getFirstName), "Marge")
    .create();


主要特点

  • 测试失败时数据可完全重现。
  • 支持泛型、record类sealed、Java 21 排序集合。
  • 支持定义自定义生成器。
  • 支持基于 Bean Validation 注解生成数据。
  • 灵活的配置选项。
  • InstancioExtension对于 Junit 5 @ExtendWith。
  • 通过模块支持 Guava instancio-guava(实验性)
  • 通过模块支持基于属性的测试instancio-quickcheck(实验性)