Einführung in JaVers

1. Übersicht

In diesem Artikel werden wir uns die JaVers- Bibliothek ansehen .

Diese Bibliothek hilft Programmierern, Änderungen im Status einfacher Java-Objekte zu untersuchen und zu erkennen. Wenn wir veränderbare Objekte in unserem Code verwenden, kann jedes Objekt möglicherweise an verschiedenen Stellen in der Anwendung geändert werden. JaVers würde uns helfen, diese Änderungen zu entdecken und zu prüfen .

2. Maven-Abhängigkeit

Lassen Sie uns zunächst die Javers-Core- Maven-Abhängigkeit zu unserer pom.xml hinzufügen :

 org.javers javers-core 3.1.0 

Wir finden die neueste Version auf Maven Central.

3. Erkennen von POJO-Statusänderungen

Beginnen wir mit einer einfachen Personenklasse :

public class Person { private Integer id; private String name; // standard getters/constructors }

Angenommen, wir haben in einem Teil unserer Anwendung ein Personenobjekt erstellt , und in einem anderen Teil der Codebasis wurde der Name der Person mit demselben ID- Feld geändert. Wir möchten sie vergleichen, um herauszufinden, welche Änderungen am Objekt der Person vorgenommen wurden.

Wir können diese beiden Objekte mit der compare () -Methode aus der JaVers- Klasse vergleichen:

@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. Erkennen einer Statusänderung der Objektliste

Wenn wir mit Sammlungen von Objekten arbeiten, müssen wir ebenfalls Statusänderungen untersuchen, indem wir uns jedes Element in der Sammlung ansehen. Manchmal möchten wir das bestimmte Objekt zur Liste hinzufügen oder daraus entfernen und seinen Status ändern.

Schauen wir uns ein Beispiel an . Angenommen, wir haben eine Liste von Objekten und entfernen ein Objekt aus dieser Liste.

Diese Änderung kann aus irgendeinem Grund unerwünscht sein, und wir möchten die in dieser Liste vorgenommenen Änderungen überprüfen. JaVers ermöglicht es uns, dies mit einer compareCollections () -Methode zu tun :

@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. Objektdiagramme vergleichen

In realen Wortanwendungen beschäftigen wir uns häufig mit den Objektgraphen. Nehmen wir an , wir haben eine PersonWithAddress Klasse , die eine Liste der hat Adresse Objekte und fügen wir eine neue Adresse für die jeweilige Person.

Wir können die Art der eingetretenen Änderung leicht finden:

@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"))); }

Ebenso wird das Entfernen einer Adresse erkannt:

@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. Fazit

In diesem kurzen Artikel haben wir die JaVers-Bibliothek verwendet, eine nützliche Bibliothek, die uns APIs zum Erkennen von Statusänderungen in unseren Objekten bietet. Es kann nicht nur die Änderung in einem einfachen POJO-Objekt erkennen, sondern auch komplexere Verschiebungen in den Sammlungen von Objekten oder sogar Objektgraphen.

Wie immer ist der Code auf GitHub verfügbar.