Я использую junit-extension / randomBeans, и я использую что-то вроде этого:
@Random(type = Album.class, excludes = {"images.id", "images.lastUpdate"})
private List<Album> albums;
Альбом содержит List<Image> images, и я пытаюсь исключить Image.id и Image.lastUpdate из случайной генерации, но это не работает.
Я также пробовал с excludes = {"images[].id", "images[].lastUpdate"}, но он тоже не работает.
Есть идеи, как исключить id и lastUpdate изображения из случайной генерации?
РЕДАКТИРОВАТЬ
Ниже:
@Random(excludes = {"id", "dirty", "cover", "lastUpdate", "images.id",
"images.lastUpdate", "images.status", "images.deleted"})
private Album specialAlbum;
1-е изображение (индекс 0) всегда "случайно" сгенерировано правильно, но для остальных набор свойств исключен.
Также использую:
public class RandomBeansExtensionEx extends RandomBeansExtension
implements IEnhancedRandom {
public RandomBeansExtensionEx() throws IllegalAccessException {
super();
FieldUtils.writeField(this, "random",
EnhancedRandomBuilder.aNewEnhancedRandomBuilder()
.objectPoolSize(100)
.overrideDefaultInitialization(true)
.charset(forName("UTF-8"))
.randomize(Integer.class, (Supplier<Integer>) () ->
ThreadLocalRandom.current().nextInt(0, Integer.MAX_VALUE))
.randomize(Long.class, (Supplier<Long>) () ->
ThreadLocalRandom.current().nextLong(0, Long.MAX_VALUE))
.stringLengthRange(3, 15)
.collectionSizeRange(1, 50)
.scanClasspathForConcreteTypes(true)
.build(), true);
}
}





Расширения JUnit содержат тестовый пример, который проверяет исключение для вложенных атрибутов:
@Test
public void canInjectRandomPartiallyPopulatedDomainObjects(
@Random(size = 2, type = DomainObject.class, excludes = {"wotsits", "id", "nestedDomainObject.address"})
List<DomainObject> anyPartiallyPopulatedDomainObjects) {
assertThat(anyPartiallyPopulatedDomainObjects, notNullValue());
assertThat(anyPartiallyPopulatedDomainObjects.size(), is(2));
anyPartiallyPopulatedDomainObjects.forEach(AssertionUtil::assertThatDomainObjectIsPartiallyPopulated);
}
В этом тестовом примере расширение RandomBeans предоставляет List<DomainObject> два экземпляра DomainObject, каждый из которых имеет следующие функции:
wotsits исключена, т. е. nullid исключен, то есть это 0L, поскольку это значение по умолчанию для longaddress каждого nestedDomainObject - nullЭто показывает, что исключение атрибутов вложенных объектов зависит от использования точечной нотации (nestedDomainObject.address.
Обновлять: используя код из вашего Репозиторий GitHub, я создал следующий минимальный случай воспроизведения:
@ExtendWith(RandomBeansExtensionEx.class)
public class NestedAttributeTest {
@Random(excludes = {"id", "dirty", "cover", "lastUpdate", "images.id", "images.lastUpdate", "images.status", "images.deleted"})
private Album specialAlbum;
@Test
void testAttributeExclusion() {
assertThat(specialAlbum.getId(), nullValue());
assertThat(specialAlbum.getCover(), nullValue());
assertThat(specialAlbum.getLastUpdate(), nullValue());
assertThat(specialAlbum.getImages(), notNullValue());
for (Image image : specialAlbum.getImages()) {
assertThat(image.getId(), nullValue());
assertThat(image.getLastUpdate(), nullValue());
}
}
}
Этот тестовый пример не проходит, тем самым воспроизводя вашу проблему.
В этом случае воспроизведения я вижу, что проблема, с которой вы столкнулись, вызвана двунаправленной связью между Album и Image. Тот факт, что каждый Image содержит ссылку на свой родительский Album, приводит к тому, что RandomizationContext.getFieldFullName() RandomBeans получает неправильное имя для каждого атрибута в Image.
id во внедренном образе называется image.id, и поэтому успешно исключает его.id во внедренном образе называется images.album.images.id, и поэтому не исключает его, поскольку этого имени нет в списке исключений.id во внедренном образе называется images.album.images.album.images.id и, следовательно, не исключает его, поскольку этого имени нет в списке исключений.
так далееВы можете проверить это ...
Image.album и повторно запустите минимальный тест, который я предоставил, и вы увидите, что он проходит..collectionSizeRange(1, 1), чтобы каждая случайная коллекция содержала только один элемент, и вы увидите, что минимальный тест, который я предоставил, проходит.В настоящее время RandomBeans (и, следовательно, RandomBeansExtension) не поддерживает исключение вложенных атрибутов в следующем сценарии:
Я думаю, что исправление здесь состоит в том, чтобы исключить атрибут item.album. Проходит следующий тест:
@ExtendWith(RandomBeansExtensionEx.class)
public class NestedAttributeTest {
@Random(excludes = {"id", "dirty", "cover", "lastUpdate", "images.album", "images.id", "images.lastUpdate", "images.status", "images.deleted"})
private Album specialAlbum;
@Test
void testAttributeExclusion() {
assertThat(specialAlbum.getId(), nullValue());
assertThat(specialAlbum.getCover(), nullValue());
assertThat(specialAlbum.getLastUpdate(), nullValue());
assertThat(specialAlbum.getImages(), notNullValue());
for (Image image : specialAlbum.getImages()) {
assertThat(image.getId(), nullValue());
assertThat(image.getLastUpdate(), nullValue());
}
}
}
Используйте github.com/adrhc/photos-server.git. Используйте соответствующий @Random на private Album specialAlbum. Поместите точку останова отладки для первой строки в AlbumPageServiceTest.setUpSpecialAlbum и начните отладку любого метода тестирования. Проверяйте значение this.specialAlbum при достижении точки останова. Чтобы полноценный тест работал, вам также придется использовать скрипты MySQL и exifweb-no-data.sql, но для нашей цели достаточно отладки.
Я только что запустил этот тест и, остановившись на первой строке AlbumPageServiceTest.setUpSpecialAlbum, я вижу, что specialAlbum был заполнен, исключая id, dirty, images, cover, lastUpdate, точно так же, как аннотация к этому состоянию члена класса. Мне все еще непонятно, что вы ждете от меня. Примечание: я закомментировал @Junit5PhotosStagingDbConfig, потому что у меня нет времени установить mysql и запустить exifweb-no-data.sql ... Я думаю, что этот тестовый пример отсутствует на M в MCVE ... «Минимальный - используйте как можно меньше кода, который по-прежнему вызывает ту же проблему» :)
Я еще раз посмотрю, сможете ли вы создать минимальный пример (достаточно 4 классов - Album, Image, RandomBeansExtensionEx и небольшой тестовый пример), который воспроизводит проблему.
Явно отсутствует часть M: D. Пожалуйста, используйте @Random(excludes = {"id", "dirty", "cover", "lastUpdate", "images.id", "images.lastUpdate", "images.status", "images.deleted"}) (1-я закомментированная строка над private Album specialAlbum) и прокомментируйте используемый в настоящее время @Random(excludes = {"id", "lastUpdate", "status", "deleted"}).
На самом деле я никогда не намеревался генерировать значение item.album случайным образом, поэтому это была моя ошибка. Спасибо, что указали мне на это.
Что ж, с моей точки зрения, это не проблема randombeans, а только мое неправильное использование, которое теперь было выяснено, поэтому я считаю этот поток РЕШЕННЫМ.
Спасибо, я попытался отметить эту тему как решенную, но пропустил эту функцию.
Повторите ваши последние обновления вопроса; Я все еще не могу воспроизвести вашу проблему. Если бы вы могли предоставить MCVE, который включает минимальный код для воспроизведения проблемы, я уверен, что смогу диагностировать. Можете ли вы сократить проблему до простой пары классов (
AlbumиImage) и небольшого тестового примера и обновить свой вопрос этими деталями? Учитывая, что поведение расширения RandomBeans по умолчанию доказано для исключения вложенных атрибутов (с помощью тестового примера, который я привел в своем ответе), я не смогу диагностировать вашу проблему без MCVE.