Есть ли библиотека java, которая поможет создать экземпляры классов для тестирования? Один, который исследует свойства a bean и заполняет его случайными данными.
Я в основном ищу Java-эквивалент Object Hydrator для С#.
Заполнить примитивные свойства случайными данными автоматически?
Ответ 1
Вы можете использовать PoDaM:
PodamFactory factory = new PodamFactoryImpl();
Pojo myPojo = factory.manufacturePojo(Pojo.class);
Ответ 2
Взгляните на Случайный Beans:
https://github.com/benas/random-beans
Он позволяет заполнять график объектов Java случайными данными.
Надеюсь, что это поможет Отношения
Ответ 3
Я не знаю рамки, но довольно просто написать один из них. Сложность заключается в непростых свойствах, так называемых объектных ассоциациях. Что-то вроде этого обрабатывает основы, а затем некоторые:
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();
}
}
Ответ 4
Вы можете проверить randomizer для генерации случайных данных. Эта библиотека помогает создавать случайные данные из данного класса Model.Checkout ниже пример кода.
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);
Поскольку существует множество встроенных генераторов данных, доступных с помощью аннотации, вы также можете создавать генератор пользовательских данных. Я предлагаю вам пройти документацию, представленную на странице библиотеки.
Ответ 5
https://github.com/benas/random-beans выполнил эту работу для меня, в то время как PoDam не удался с "плавными" сеттерами и ответ Райана Стюарта не был полным для копирования- вставить как есть ссылки на классы, которые не отображаются! С random- beans это легко:
Auction auction = EnhancedRandom.random(Auction.class);
Gradle:
testCompile ('io.github.benas:random-beans:3.4.0')
Ответ 6
Для тестирования наша группа добилась определенных успехов в JUnit и Mockito. Вот ссылка на ответ Mockito.
Я не уверен, что заполнение случайными данными будет значимым тестом. Возможно, более значимый тест будет проверять нормальные, граничные и ошибки.
Ответ 7
Я использовал отражение и рекурсию здесь, чтобы получить все поля, заполненные моим надежным объектом, который я хотел получить. Это использование PODAM, и я надеюсь, что кто-то найдет это полезным.
public class Populate {
private final PodamFactory podamFactory = new PodamFactoryImpl();
private <P> P getManufacturedPojo(final Class<P> klass) {
return podamFactory.manufacturePojo(klass);
}
private Object populateAllIn(final Class targetClass) throws IllegalAccessException, InstantiationException {
final Object target = targetClass.newInstance();
//Get all fields present on the target class
final Set<Field> allFields = getAllFields(targetClass, Predicates.<Field>alwaysTrue());
//Iterate through fields
for (final Field field : allFields) {
//Set fields to be accessible even when private
field.setAccessible(true);
final Class<?> fieldType = field.getType();
if (fieldType.isEnum() && EnrichmentType.class.isAssignableFrom(fieldType)) {
//handle any enums here if you have any
}
//Check if the field is a collection
if (Collection.class.isAssignableFrom(fieldType)) {
//Get the generic type class of the collection
final Class<?> genericClass = getGenericClass(field);
//Check if the generic type of a list is abstract
if (Modifier.isAbstract(genericClass.getModifiers())) {
//You might want to use any class that extends
//Your abstract class like
final List<Object> list = new ArrayList<>();
list.add(populateAllIn(ClassExtendingAbstract.class));
field.set(target, list);
} else {
final List<Object> list = new ArrayList<>();
list.add(populateAllIn(genericClass));
field.set(target, list);
}
} else if ((isSimpleType(fieldType) || isSimplePrimitiveWrapperType(fieldType)) && !fieldType.isEnum()) {
field.set(target, getManufacturedPojo(fieldType));
} else if (!fieldType.isEnum()) {
field.set(target, populateAllIn(fieldType));
}
}
return target;
}
И некоторые вспомогательные методы. Код может быть не идеальным, но работает:).
private Class<?> getGenericClass(final Field field) {
final ParameterizedType collectionType = (ParameterizedType) field.getGenericType();
return (Class<?>) collectionType.getActualTypeArguments()[0];
}
private boolean isSimpleType(final Class<?> fieldType) {
return fieldType.isPrimitive()
|| fieldType.isEnum()
|| String.class.isAssignableFrom(fieldType)
|| Date.class.isAssignableFrom(fieldType);
}
private boolean isSimplePrimitiveWrapperType(final Class<?> fieldType) {
return Integer.class.isAssignableFrom(fieldType)
|| Boolean.class.isAssignableFrom(fieldType)
|| Character.class.isAssignableFrom(fieldType)
|| Long.class.isAssignableFrom(fieldType)
|| Short.class.isAssignableFrom(fieldType)
|| Double.class.isAssignableFrom(fieldType)
|| Float.class.isAssignableFrom(fieldType)
|| Byte.class.isAssignableFrom(fieldType);
}
Спасибо, и если есть более простой способ заполнить все, пожалуйста, дайте мне знать.