如何在单元测试中生成测试数据?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 提供的用于测试数据生成的一小部分定制。您可以在他们的文档中阅读更多关于其他选项的信息。