Рубрики
Без рубрики

Введение в Java

JaVers помогает программистам в обнаружении и аудите изменений в состояниях простых объектов Java.

Автор оригинала: baeldung.

1. Обзор

В этой статье мы рассмотрим библиотеку JaVers .

Эта библиотека помогает программистам исследовать и обнаруживать изменения в состояниях простых объектов Java. Когда мы используем изменяемые объекты в нашем коде, каждый объект потенциально может быть изменен в различных местах приложения; JaVers поможет нам обнаружить и проверить эти изменения .

2. Зависимость Maven

Для начала давайте добавим зависимость javers-core Maven в ваш pom.xml :


    org.javers
    javers-core
    3.1.0

Мы можем найти последнюю версию на Maven Central .

3. Обнаружение Изменений Состояния POJO

Давайте начнем с простого Человека класса:

public class Person {
    private Integer id;
    private String name;

    // standard getters/constructors
}

Предположим, что мы создали объект Person в одной части нашего приложения, а в какой-то другой части кодовой базы имя человека с тем же идентификатором было изменено. Мы хотим сравнить их, чтобы выяснить, какие изменения произошли с объектом-человеком.

Мы можем сравнить эти два объекта, используя метод compare() из класса JaVers :

@Test
public void givenPersonObject_whenApplyModificationOnIt_thenShouldDetectChange() {
    // given
    Javers javers = JaversBuilder.javers().build();

    Person person = new Person(1, "Michael Program");
    Person personAfterModification = new Person(1, "Michael Java");

    // when
    Diff diff = javers.compare(person, personAfterModification);

    // then
    ValueChange change = diff.getChangesByType(ValueChange.class).get(0);

    assertThat(diff.getChanges()).hasSize(1);
    assertThat(change.getPropertyName()).isEqualTo("name");
    assertThat(change.getLeft()).isEqualTo("Michael Program");
    assertThat(change.getRight()).isEqualTo("Michael Java");
}

4. Обнаружение изменения состояния списка объектов

Если мы работаем с коллекциями объектов, нам также необходимо изучить изменения состояния, посмотрев на каждый элемент в коллекции. Иногда мы хотим добавить или удалить конкретный объект из списка, изменив его состояние.

Давайте рассмотрим пример ; скажем, у нас есть список объектов, и мы удаляем один объект из этого списка.

Это изменение может быть нежелательным по какой-то причине, и мы хотим провести аудит изменений, произошедших в этом списке. JaVers позволяет нам сделать это с помощью метода compare Collections() :

@Test
public void givenListOfPersons_whenCompare_ThenShouldDetectChanges() {
    // given
    Javers javers = JaversBuilder.javers().build();
    Person personThatWillBeRemoved = new Person(2, "Thomas Link");
    List oldList = 
      Lists.asList(new Person(1, "Michael Program"), personThatWillBeRemoved);
    List newList = 
      Lists.asList(new Person(1, "Michael Not Program"));

    // when
    Diff diff = javers.compareCollections(oldList, newList, Person.class);

    // then
    assertThat(diff.getChanges()).hasSize(3);

    ValueChange valueChange = 
      diff.getChangesByType(ValueChange.class).get(0);
 
    assertThat(valueChange.getPropertyName()).isEqualTo("name");
    assertThat(valueChange.getLeft()).isEqualTo("Michael Program");
    assertThat(valueChange.getRight()).isEqualTo("Michael Not Program");

    ObjectRemoved objectRemoved = diff.getChangesByType(ObjectRemoved.class).get(0);
    assertThat(
      objectRemoved.getAffectedObject().get().equals(personThatWillBeRemoved))
      .isTrue();

    ListChange listChange = diff.getChangesByType(ListChange.class).get(0);
    assertThat(listChange.getValueRemovedChanges().size()).isEqualTo(1);
}

5. Сравнение графов Объектов

В реальных приложениях мы часто имеем дело с графами объектов. Допустим, у нас есть Человек с адресом класс, у которого есть список объектов Адрес , и мы добавляем новый адрес для данного человека.

Мы можем легко найти тип произошедших изменений:

@Test
public void givenListOfPerson_whenPersonHasNewAddress_thenDetectThatChange() {
    // given
    Javers javers = JaversBuilder.javers().build();

    PersonWithAddress person = 
      new PersonWithAddress(1, "Tom", Arrays.asList(new Address("England")));

    PersonWithAddress personWithNewAddress = 
      new PersonWithAddress(1, "Tom", 
        Arrays.asList(new Address("England"), new Address("USA")));


    // when
    Diff diff = javers.compare(person, personWithNewAddress);
    List objectsByChangeType = diff.getObjectsByChangeType(NewObject.class);

    // then
    assertThat(objectsByChangeType).hasSize(1);
    assertThat(objectsByChangeType.get(0).equals(new Address("USA")));
}

Аналогично, будет обнаружено удаление адреса:

@Test
public void givenListOfPerson_whenPersonRemovedAddress_thenDetectThatChange() {
    // given
    Javers javers = JaversBuilder.javers().build();

    PersonWithAddress person = 
      new PersonWithAddress(1, "Tom", Arrays.asList(new Address("England")));

    PersonWithAddress personWithNewAddress = 
      new PersonWithAddress(1, "Tom", Collections.emptyList());


    // when
    Diff diff = javers.compare(person, personWithNewAddress);
    List objectsByChangeType = diff.getObjectsByChangeType(ObjectRemoved.class);

    // then
    assertThat(objectsByChangeType).hasSize(1);
    assertThat(objectsByChangeType.get(0).equals(new Address("England")));
}

6. Заключение

В этой краткой статье мы использовали библиотеку Java, полезную библиотеку, которая предоставляет нам API для обнаружения изменений состояния в наших объектах. Он может не только обнаружить изменения в простом объекте POJO, но и обнаружить более сложные сдвиги в коллекциях объектов или даже графиках объектов.

Как всегда, код доступен на GitHub .