自动用随机数据填充原始属性?

pra*_*pes 45 java testing

是否有一个java库可以帮助创建用于测试的类的实例?一个检查bean的属性并用随机数据填充它.
我基本上在寻找与C#的Object Hydrator相当的Java .

小智 53

你可以使用PoDaM:

PodamFactory factory = new PodamFactoryImpl();
Pojo myPojo = factory.manufacturePojo(Pojo.class);
Run Code Online (Sandbox Code Playgroud)


Mah*_*ine 21

看看随机豆:

https://github.com/benas/random-beans

它允许您使用随机数据填充Java对象图.

希望它有助于问候

  • 刚好看到这个帖子。还没有尝试过,快速浏览一下,似乎很好,因为它支持对象的层次结构/嵌套。干得好。谢谢你同样的。 (2认同)

Rya*_*art 13

我不知道一个框架,但是自己编写其中一个框架非常简单.复杂性来自非简单属性,即对象关联.像这样的东西处理基础知识然后一些:

public static void randomlyPopulateFields(Object object) {
    new RandomValueFieldPopulator().populate(object);
}

public static class RandomValueFieldPopulator {
    public void populate(Object object) {
        ReflectionUtils.doWithFields(object.getClass(), new RandomValueFieldSetterCallback(object));
    }

    private static class RandomValueFieldSetterCallback implements FieldCallback {
        private Object targetObject;

        public RandomValueFieldSetterCallback(Object targetObject) {
            this.targetObject = targetObject;
        }

        @Override
        public void doWith(Field field) throws IllegalAccessException {
            Class<?> fieldType = field.getType();
            if (!Modifier.isFinal(field.getModifiers())) {
                Object value = generateRandomValue(fieldType, new WarnOnCantGenerateValueHandler(field));
                if (!value.equals(UNGENERATED_VALUE_MARKER)) {
                    ReflectionUtils.makeAccessible(field);
                    field.set(targetObject, value);
                }
            }
        }
    }
}

public static Object generateRandomValue(Class<?> fieldType, CantGenerateValueHandler cantGenerateValueHandler) {
    if (fieldType.equals(String.class)) {
        return UUID.randomUUID().toString();
    } else if (Date.class.isAssignableFrom(fieldType)) {
        return new Date(System.currentTimeMillis() - random.nextInt(DATE_WINDOW_MILLIS));
    } else if (Number.class.isAssignableFrom(fieldType)) {
        return random.nextInt(Byte.MAX_VALUE) + 1;
    } else if (fieldType.equals(Integer.TYPE)) {
        return random.nextInt();
    } else if (fieldType.equals(Long.TYPE)) {
        return random.nextInt();
    } else if (Enum.class.isAssignableFrom(fieldType)) {
        Object[] enumValues = fieldType.getEnumConstants();
        return enumValues[random.nextInt(enumValues.length)];
    } else {
        return cantGenerateValueHandler.handle();
    }
}
Run Code Online (Sandbox Code Playgroud)


Ron*_*iya 5

你可以检查随机数发生器以进行随机数据生成.这个库有助于从给定的Model类创建随机数据.请查看下面的示例代码.

public class Person {

   @FirstName
   String mFirstName;

   @LastName
   String mLastName;

   @Number(min = 14,max = 25,decimals = 0)
   int age;

   @DateValue( from = "01 Jan 1990",to = "31 Dec 2002" , customFormat = "dd MMM yyyy")
   String dateOfBirth;

   @Email
   String  mEmailId;

   @StreetAddress
   public String streetAddress;

   @State
   public String state;

   //Person can have minimum 1 Phone number and maximum 3 phone number
   @Phone(country = Phone.Country.INDIA)
   @CollectionDescriptor(min = 1,max = 3) 
   List<String> phones;

}

//Generate random 100 Person(Model Class) object 
Generator<Person> generator = new Generator<>(Person.class);  
List<Person> persons = generator.generate(100);                          
Run Code Online (Sandbox Code Playgroud)

由于有许多内置数据生成器可以使用注释访问,您还可以构建自定义数据生成器.我建议您浏览库页面上提供的文档.

  • 这个库看起来不错,除了它需要修改Beans只是为了进行测试。 (2认同)

小智 5

https://github.com/benas/random-beans为我做了工作,而PoDam以"流利"的设置者失败了,Ryan Stewart的回答并不完整,因为对于没有暴露的类的引用!使用随机bean,它很简单:

Auction auction = EnhancedRandom.random(Auction.class);
Run Code Online (Sandbox Code Playgroud)

摇篮:

testCompile ('io.github.benas:random-beans:3.4.0')
Run Code Online (Sandbox Code Playgroud)