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
创建对象流:
Stream
创建泛型类型:
Pair, List
自定义生成的值:
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(); |
创建可重用的对象模板(模型):
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(实验性)