Einführung zu JaVers

Einführung zu JaVers

1. Überblick

In diesem Artikel werden wir uns die BibliothekJaVersansehen.

Diese Bibliothek hilft Programmierern, Änderungen in den Zuständen 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 would help us discover and audit these changes.

2. Maven-Abhängigkeit

Um zu beginnen, fügen wir diejavers-core Maven-Abhängigkeit zu unserenpom.xml hinzu:


    org.javers
    javers-core
    3.1.0

Wir können die neueste Version überMaven Central finden.

3. POJO-Statusänderungen erkennen

Beginnen wir mit einer einfachenPerson-Klasse:

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

    // standard getters/constructors
}

Angenommen, wir haben in einem Teil unserer Anwendung einPerson-Objekt erstellt, und in einem anderen Teil der Codebasis wurde der Name desthe person with the same id-Felds geändert. Wir wollen sie vergleichen, um herauszufinden, welche Art von Änderungen mit dem Personenobjekt geschehen sind.

Wir können diese beiden Objekte mit dercompare()-Methode aus derJaVers-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 ein bestimmtes Objekt zur Liste hinzufügen oder daraus entfernen, um seinen Status zu ändern.

Let’s have a look at an example; 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 überwachen. JaVers ermöglicht es uns, dies mit dercompareCollections()-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 einePersonWithAddress-Klasse mit einer Liste derAddress-Objekte und fügen eine neue Adresse für die angegebene Person hinzu.

Wir können leicht die Art der Änderung finden, die aufgetreten ist:

@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 Codeover on GitHub verfügbar.