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.