Introduzione a JaVers

1. Panoramica

In questo articolo, esamineremo la libreria JaVers .

Questa libreria aiuta i programmatori a esaminare e rilevare i cambiamenti negli stati di semplici oggetti Java. Quando usiamo oggetti mutabili nel nostro codice, ogni oggetto può essere potenzialmente modificato in vari punti dell'applicazione; JaVers ci aiuterebbe a scoprire e controllare questi cambiamenti .

2. Dipendenza da Maven

Per iniziare aggiungiamo la dipendenza Maven javers-core al nostro pom.xml :

 org.javers javers-core 3.1.0 

Possiamo trovare l'ultima versione su Maven Central.

3. Rilevamento dei cambiamenti di stato POJO

Cominciamo con una semplice classe Person :

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

Supponiamo di aver creato un oggetto Person in una parte della nostra applicazione, e in qualche altra parte del codebase, il nome della persona con lo stesso campo id sia stato cambiato. Vogliamo confrontarli per scoprire che tipo di cambiamenti sono avvenuti all'oggetto persona.

Possiamo confrontare questi due oggetti usando il metodo compare () della classe 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. Rilevamento del cambiamento di stato dell'elenco di oggetti

Se stiamo lavorando con raccolte di oggetti, allo stesso modo dobbiamo esaminare i cambiamenti di stato osservando ogni elemento nella raccolta. A volte, vogliamo aggiungere o rimuovere un particolare oggetto dalla lista, alterandone lo stato.

Diamo un'occhiata a un esempio ; diciamo di avere una lista di oggetti e rimuoviamo un oggetto da quella lista.

Tale modifica può essere indesiderabile per qualche motivo e desideriamo controllare le modifiche apportate in questo elenco. JaVers ci permette di farlo utilizzando un metodo 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. Confronto dei grafici degli oggetti

Nelle applicazioni di parole reali, spesso ci occupiamo dei grafici a oggetti. Diciamo che abbiamo una classe PersonWithAddress che ha un elenco degli oggetti Address e stiamo aggiungendo un nuovo indirizzo per la persona data.

Possiamo facilmente trovare il tipo di cambiamento che si è verificato:

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

Allo stesso modo, verrà rilevata la rimozione di un indirizzo:

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

In questo rapido articolo, abbiamo utilizzato la libreria JaVers, un'utile libreria che ci fornisce API per rilevare i cambiamenti di stato nei nostri oggetti. Non solo è in grado di rilevare il cambiamento in un semplice oggetto POJO, ma può anche rilevare spostamenti più complessi nelle raccolte di oggetti o persino nei grafici degli oggetti.

Come sempre, il codice è disponibile su GitHub.