2

我必须用随机值填充给定对象的每个属性。这些是我对它的要求:

  • 所有属性都是本机 Java 类型(int、、、doubleString
  • 我可以使用反射
  • 我可以使用弹簧DirectFieldAccessor

我不想重新发明方轮,所以我更愿意问。现在我想出了这个:

获取所有属性名称:

Field field : myObject.getClass().getDeclaredFields()

遍历这些字段并获取它们的类。

对每个已知的本机 Java 类型使用一个巨大的 switch 语句并生成一个随机值。

你怎么看?

4

4 回答 4

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()));
  }
}
于 2018-11-01T20:39:51.537 回答
1

因为这是 随机数据生成的一种随机化器。这仅使用您提到的反射概念它检查字段上提到的注释,并基于它检查 Provider 类。通过Person模型类。它有一些原始和非原始的 fo 字段。

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注释构建自定义数据生成器。我建议您阅读库页面上提供的文档。

于 2016-10-24T18:29:23.123 回答
0

您可以使用名为MockNeat的库以编程方式用可以作为“真实”传递的任意数据“填充”您的对象。

例如,为了填充一个对象,您可以查看一下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

后期编辑:

自从我最初的回答以来,已经添加了更多生成数据的方法。

于 2017-12-15T16:11:08.087 回答
0

您可以尝试Random-JPA,这是一个旨在生成随机数据的框架。设置是最小的。

用法:

CreationPlan creationPlan = jpaContext.create(
        Entity.of(Employee.class, 2).with(Employee_.Country, INDIA),
        Entity.of(Person.class).with(Person_.gender, "Male"));
于 2018-11-01T18:38:10.050 回答