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"); ListoldList = 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 .