Java 库:Instancio介绍


如何在单元测试中生成测试数据?Instancio 将帮助我们解决这个问题。它旨在减少单元测试中手动数据设置所花费的时间和代码行数。它使用随机数据实例化和填充对象,使我们的测试更加动态。我们可以使用 Instancio 生成随机数据,但同时,我们可以在特定字段中设置自定义数据。
在我们开始使用 Instancio 之前,让我们讨论一下我们的数据模型。这是 - Person:

public class Person {

   private Long id;
   private String name;
   private int age;
   private Gender gender;
   private Address address;

   // getters and setters ...

}

我们的类包含三个简单字段 ( id, name, age)、一个枚举Gender和Address类的实例。性别只是一个包含值MALE的简单枚举。FEMALE这是Address该类的实现:

public class Address {

   private String country;
   private String city;
   private String street;
   private int houseNumber;
   private int flatNumber;

   // getters and setters ...

}

现在,让我们创建一个测试来检查Person服务是否会成功地从商店添加和获取对象。我们希望为除id服务设置的字段之外的所有字段生成随机数据。这是我们的测试:

@Test
void addAndGet() {
   Person person = Instancio.of(Person.class)
             .ignore(Select.field(Person::getId))
             .create();
   person = personService.addPerson(person);
   Assertions.assertNotNull(person.getId());
   person = personService.findById(person.getId());
   Assertions.assertNotNull(person);
   Assertions.assertNotNull(person.getAddress());
}

为我的测试运行生成的值如下所示。如您所见,该id字段等于null。其他字段包含根据字段类型(String或int)生成的随机值。

Person(id=null, name=ATDLCA, age=2619, gender=MALE, 
address=Address(country=FWOFRNT, city=AIRICCHGGG, street=ZZCIJDZ, houseNumber=5530, flatNumber=1671))

让我们看看如何使用 Instancio 生成多个对象。假设我们需要列表中的 5 个对象进行测试,我们可以按以下方式进行。我们还将为对象city内部的字段设置一个常量值。Address然后我们想测试一下通过城市名称搜索对象的方法。

@Test
void addListAndGet() {
   final int numberOfObjects = 5;
   final String city = "Warsaw";
   List<Person> persons = Instancio.ofList(Person.class)
           .size(numberOfObjects)
           .set(Select.field(Address::getCity), city)
           .create();
   personService.addPersons(persons);
   persons = personService.findByCity(city);
   Assertions.assertEquals(numberOfObjects, persons.size());
}

让我们看一下最后一个例子。和以前一样,我们正在生成一个对象列表——这次是 100 个。我们可以轻松地为生成的值指定附加条件。例如,我想为该age字段设置一个介于 18 和 65 之间的值。

@Test
void addGeneratorAndGet() {
   List<Person> persons = Instancio.ofList(Person.class)
            .size(100)
            .ignore(Select.field(Person::getId))
            .generate(Select.field(Person::getAge), 
                      gen -> gen.ints().range(18, 65))
            .create();
   personService.addPersons(persons);
   persons = personService.findAllGreaterThanAge(40);
   Assertions.assertTrue(persons.size() > 0);
}

这只是 Instancio 提供的用于测试数据生成的一小部分定制。您可以在他们的文档中阅读更多关于其他选项的信息。