Вступ до JaVers

1. Огляд

У цій статті ми розглянемо бібліотеку JaVers .

Ця бібліотека допомагає програмістам вивчати та виявляти зміни стану простих об'єктів Java. Коли ми використовуємо змінні об'єкти в коді, кожен об'єкт потенційно може бути змінений в різних місцях програми; JaVers допоможе нам виявити та перевірити ці зміни .

2. Залежність Мавена

Для початку додамо до нашого pom.xml залежність Javen-core Maven :

 org.javers javers-core 3.1.0 

Ми можемо знайти останню версію на Maven Central.

3. Виявлення змін стану POJO

Почнемо з простого класу Person :

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 дозволяє нам це робити, використовуючи метод compareCollections () :

@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. Порівняння графіків об’єктів

У реальних прикладних програмах ми часто маємо справу з графіками об’єктів. Скажімо, у нас є клас PersonWithAddress, який містить список об’єктів Address, і ми додаємо нову адресу для даної людини.

Ми можемо легко знайти тип змін, що відбулися:

@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. Висновок

У цій короткій статті ми використали бібліотеку JaVers, корисну бібліотеку, яка надає нам API для виявлення змін стану в наших об’єктах. Він не тільки може виявити зміну простого об’єкта POJO, але також може виявити більш складні зрушення в колекціях об’єктів або навіть графіках об’єктів.

Як завжди, код доступний на GitHub.