JUnit Extensions randombeans - исключить свойство объекта в коллекции

Я использую 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);
    }
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
297
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Расширения 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 исключена, т. е. null
  • атрибут id исключен, то есть это 0L, поскольку это значение по умолчанию для long
  • Атрибут address каждого 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.

  1. На первой итерации он определяет, что поле id во внедренном образе называется image.id, и поэтому успешно исключает его.
  2. На второй итерации он определяет, что поле id во внедренном образе называется images.album.images.id, и поэтому не исключает его, поскольку этого имени нет в списке исключений.
  3. На третьей итерации он определяет, что поле id во внедренном образе называется images.album.images.album.images.id и, следовательно, не исключает его, поскольку этого имени нет в списке исключений. так далее

Вы можете проверить это ...

  • Прокомментируйте Image.album и повторно запустите минимальный тест, который я предоставил, и вы увидите, что он проходит.
  • Измените конфигурацию на .collectionSizeRange(1, 1), чтобы каждая случайная коллекция содержала только один элемент, и вы увидите, что минимальный тест, который я предоставил, проходит.

В настоящее время RandomBeans (и, следовательно, RandomBeansExtension) не поддерживает исключение вложенных атрибутов в следующем сценарии:

  • Вложенные атрибуты находятся в коллекции с более чем 1 элементом
  • Объекты в этой коллекции содержат обратную ссылку на содержащий класс
  • Атрибут обратной ссылки не исключен

Я думаю, что исправление здесь состоит в том, чтобы исключить атрибут 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());
        }
    }
} 

Повторите ваши последние обновления вопроса; Я все еще не могу воспроизвести вашу проблему. Если бы вы могли предоставить MCVE, который включает минимальный код для воспроизведения проблемы, я уверен, что смогу диагностировать. Можете ли вы сократить проблему до простой пары классов (Album и Image) и небольшого тестового примера и обновить свой вопрос этими деталями? Учитывая, что поведение расширения RandomBeans по умолчанию доказано для исключения вложенных атрибутов (с помощью тестового примера, который я привел в своем ответе), я не смогу диагностировать вашу проблему без MCVE.

glytching 15.03.2018 21:13

Используйте github.com/adrhc/photos-server.git. Используйте соответствующий @Random на private Album specialAlbum. Поместите точку останова отладки для первой строки в AlbumPageServiceTest.setUpSpecialAlbum и начните отладку любого метода тестирования. Проверяйте значение this.specialAlbum при достижении точки останова. Чтобы полноценный тест работал, вам также придется использовать скрипты MySQL и exifweb-no-data.sql, но для нашей цели достаточно отладки.

adrhc 16.03.2018 20:21

Я только что запустил этот тест и, остановившись на первой строке AlbumPageServiceTest.setUpSpecialAlbum, я вижу, что specialAlbum был заполнен, исключая id, dirty, images, cover, lastUpdate, точно так же, как аннотация к этому состоянию члена класса. Мне все еще непонятно, что вы ждете от меня. Примечание: я закомментировал @Junit5PhotosStagingDbConfig, потому что у меня нет времени установить mysql и запустить exifweb-no-data.sql ... Я думаю, что этот тестовый пример отсутствует на M в MCVE ... «Минимальный - используйте как можно меньше кода, который по-прежнему вызывает ту же проблему» :)

glytching 16.03.2018 20:45

Я еще раз посмотрю, сможете ли вы создать минимальный пример (достаточно 4 классов - Album, Image, RandomBeansExtensionEx и небольшой тестовый пример), который воспроизводит проблему.

glytching 16.03.2018 20:45

Явно отсутствует часть 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"}).

adrhc 16.03.2018 21:10

На самом деле я никогда не намеревался генерировать значение item.album случайным образом, поэтому это была моя ошибка. Спасибо, что указали мне на это.

adrhc 17.03.2018 09:44

Что ж, с моей точки зрения, это не проблема randombeans, а только мое неправильное использование, которое теперь было выяснено, поэтому я считаю этот поток РЕШЕННЫМ.

adrhc 18.03.2018 09:48

Спасибо, я попытался отметить эту тему как решенную, но пропустил эту функцию.

adrhc 18.03.2018 16:59

Другие вопросы по теме