我必须用随机值填充给定对象的每个属性。 这些是我对它的要求:
int
,double
,String
等)DirectFieldAccessor
我不想重新发明方形轮,所以我更愿意问。
现在我想出了这个:
获取所有属性名称:
Field field : myObject.getClass().getDeclaredFields()
迭代这些领域并获得他们的课程。
对每个已知的本机Java类型使用巨型switch语句并生成随机值。
您怎么看?
答案 0 :(得分:2)
另一个选项是QuickTheories。看起来像:
import static org.quicktheories.QuickTheory.qt;
import static org.quicktheories.generators.SourceDSL.*;
public class SomeTests {
@Test
public void addingTwoPositiveIntegersAlwaysGivesAPositiveInteger(){
qt()
.forAll(integers().allPositive()
, integers().allPositive())
.check((i,j) -> i + j > 0);
}
@Test
public void someTheoryOrOther(){
qt()
.forAll(integers().allPositive()
, strings().basicLatinAlphabet().ofLengthBetween(0, 10)
, lists().allListsOf(integers().all()).ofSize(42))
.assuming((i,s,l) -> s.contains(i.toString())) // <-- an assumption
.check((i,s,l) -> l.contains(i) && s.contains(i.toString()));
}
}
答案 1 :(得分:1)
因为这是一个用于随机数据生成的randomizer。如您所述,这只使用了Reflection的概念。 它检查字段上提到的注释,并根据它检查Provider类。通过 Person 模型类。 它有一些原始的和非原始的领域。
public class Person {
@FirstName
public String mFirstName;
@LastName
public String mLastName;
@Number(min = 14,max = 25,decimals = 0)
public int age;
@Email
public String mEmailId;
@ReferenceRecord(clazz = Address.class)
public Address address;
}
@ReferencedRecord
public class Address {
@StreetAddress
public String streetAddress;
@State
public String state;
}
//Generate random 100 Person(Model Class) object
Generator<Person> generator = new Generator<>(Person.class);
List<Person> persons = generator.generate(100);
由于可以使用注释访问许多内置数据生成器,您还可以使用 @CustomGenerator 注释构建自定义数据生成器。我建议您浏览库页面上提供的文档。
答案 2 :(得分:0)
您可以使用名为MockNeat的库以编程方式“填充”您的对象,其中任意数据可以作为“真实”传递。
例如,在填充对象的oder中,您可以查看reflect()方法:
// Creates a MockNeat object that internally uses
// a ThreadLocalRandom.
MockNeat m = MockNeat.threadLocal();
List<Employee> companyEmployees =
m.reflect(Employee.class) // The class we are mocking
.field("uniqueId",
m.uuids()) // Generates a random unique identifier
.field("id",
m.longSeq()) // Generates long numbers in a sequence
.field("fullName",
m.names().full()) // Generates a full name for the employer
.field("companyEmail",
m.emails().domain("company.com")) // Generates a company email with a given domain
.field("personalEmail",
m.emails()) // Generates an arbitrary email without domain constraints
.field("salaryCreditCard",
m.creditCards().types(AMERICAN_EXPRESS, MASTERCARD)) // Generate credit card numbers of 'types'
.field("external",
m.bools().probability(20.0)) // Generates Boolean values with 20% probability of obtaining True
.field("hireDate",
m.localDates().past(of(1999, 1, 1))) // Generatest a date in the past, but greater than 01.01.1987
.field("birthDate",
m.localDates().between(of(1950, 1, 1), of(1994, 1, 1))) // Generates a data in the given range
.field("pcs",
m.reflect(EmployeePC.class) // Mock an EmployeePC object
.field("uuid",
m.uuids()) // Generates an unique identifier
.field("username",
m.users()) // Generates an arbitrary username
.field("operatingSystem",
m.from(new String[]{"Linux", "Windows 10", "Windows 8"})) // Randomly selects an OS from the given List
.field("ipAddress",
m.ipv4s().type(CLASS_B)) // Generates a CLASS B IPv4 Address
.field("macAddress",
m.macs()) // Generates a MAC Address
.list(2)) // Creates a List<EmployeePC> with 2 values
.list(1000) // Creates a List<Employee> with 1000 values
.val(); // Returns the list
答案 3 :(得分:0)
您可以尝试Random-JPA,该框架旨在生成随机数据。设置很小。
用法:
var filePath: URL! {
didSet {
// Reset the current fields
self.filenameLabel.text = "Loading"
self.createdDateLabel.text = "Loading"
self.fileSizeLabel.text = "Loading"
// And then fetch the contents
fetchContents()
}
}