Introduktion til JaVers

1. Oversigt

I denne artikel vil vi se på JaVers bibliotek.

Dette bibliotek hjælper programmører med at undersøge og opdage ændringer i tilstanden for enkle Java-objekter. Når vi bruger ændrede objekter i vores kode, kan hvert objekt potentielt ændres forskellige steder i applikationen; JaVers ville hjælpe os med at finde og revidere disse ændringer.

2. Maven-afhængighed

For at komme i gang, lad os tilføje javers-kerne Maven afhængighed af vores pom.xml:

 org.javers javers-core 3.1.0 

Vi kan finde den nyeste version på Maven Central.

3. Registrering af ændringer i POJO-tilstand

Lad os starte med en simpel Person klasse:

offentlig klasse person {privat heltal id; privat strengnavn; // standard getters / konstruktører}

Antag at vi oprettede en Person objekt i en del af vores applikation og i en anden del af kodebasen navnet på personen med samme id felt blev ændret. Vi vil sammenligne dem for at finde ud af, hvilken type ændringer der skete med personobjektet.

Vi kan sammenligne disse to objekter ved hjælp af sammenligne() metode fra JaVers klasse:

@Test offentlig ugyldighed givenPersonObject_whenApplyModificationOnIt_thenShouldDetectChange () {// givet Javers javers = JaversBuilder.javers (). Build (); Person person = ny person (1, "Michael Program"); Person personAfterModification = ny person (1, "Michael Java"); // når Diff diff = javers.compare (person, personAfterModification); // derefter ValueChange-ændring = diff.getChangesByType (ValueChange.class) .get (0); assertThat (diff.getChanges ()). hasSize (1); assertThat (change.getPropertyName ()). isEqualTo ("navn"); assertThat (change.getLeft ()). isEqualTo ("Michael Program"); assertThat (change.getRight ()). isEqualTo ("Michael Java"); }

4. Registrering af tilstandsændring af listen over objekter

Hvis vi arbejder med samlinger af objekter, er vi også nødt til at undersøge tilstandsændringer ved at se på hvert element i samlingen. Nogle gange vil vi tilføje eller fjerne det bestemte objekt fra listen og ændre dets tilstand.

Lad os se på et eksempel; siger, at vi har en liste over objekter, og vi fjerner et objekt fra listen.

Denne ændring kan være uønsket af en eller anden grund, og vi vil revidere ændringer, der opstod i denne liste. JaVers giver os mulighed for at gøre det ved hjælp af en sammenligne Samlinger () metode:

@Test public void givenListOfPersons_whenCompare_ThenShouldDetectChanges () {// given Javers javers = JaversBuilder.javers (). Build (); Person personThatWillBeRemoved = ny person (2, "Thomas Link"); Liste over oldList = Lists.asList (ny person (1, "Michael-programmet"), personThatWillBeRemoved); Liste newList = Lists.asList (ny person (1, "Michael Not Program")); // når Diff diff = javers.compareCollections (oldList, newList, Person.class); // derefter assertThat (diff.getChanges ()). hasSize (3); ValueChange valueChange = diff.getChangesByType (ValueChange.class) .get (0); assertThat (valueChange.getPropertyName ()). isEqualTo ("navn"); 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 (). er lig med (personThatWillBeRemoved)) .isTrue (); ListChange listChange = diff.getChangesByType (ListChange.class) .get (0); assertThat (listChange.getValueRemovedChanges (). størrelse ()). isEqualTo (1); }

5. Sammenligning af objektgrafer

I rigtige ordapplikationer beskæftiger vi os ofte med objektgrafene. Lad os sige, at vi har en PersonWithAddress klasse, der har en liste over Adresse objekter, og vi tilføjer en ny adresse til den givne person.

Vi kan let finde den type ændring, der er sket:

@Test offentlig ugyldighed givenListOfPerson_whenPersonHasNewAddress_thenDetectThatChange () {// givet Javers javers = JaversBuilder.javers (). Build (); PersonWithAddress person = ny PersonWithAddress (1, "Tom", Arrays.asList (ny adresse ("England"))); PersonWithAddress personWithNewAddress = ny PersonWithAddress (1, "Tom", Arrays.asList (ny adresse ("England"), ny adresse ("USA"))); // når Diff diff = javers.compare (person, personWithNewAddress); Liste objekterByChangeType = diff.getObjectsByChangeType (NewObject.class); // derefter assertThat (objectsByChangeType) .hasSize (1); assertThat (objectsByChangeType.get (0) .equals (ny adresse ("USA"))); }

Tilsvarende registreres fjernelse af en adresse:

@Test offentlig ugyldighed givenListOfPerson_whenPersonRemovedAddress_thenDetectThatChange () {// givet Javers javers = JaversBuilder.javers (). Build (); PersonWithAddress person = ny PersonWithAddress (1, "Tom", Arrays.asList (ny adresse ("England"))); PersonWithAddress personWithNewAddress = ny PersonWithAddress (1, "Tom", Collections.emptyList ()); // når Diff diff = javers.compare (person, personWithNewAddress); Liste objekterByChangeType = diff.getObjectsByChangeType (ObjectRemoved.class); // derefter assertThat (objectsByChangeType) .hasSize (1); assertThat (objectsByChangeType.get (0) .equals (ny adresse ("England"))); }

6. Konklusion

I denne hurtige artikel brugte vi JaVers-biblioteket, et nyttigt bibliotek, der giver os API'er til at opdage tilstandsændringer i vores objekter. Ikke kun kan det registrere ændringen i et simpelt POJO-objekt, men det kan også registrere mere komplekse skift i samlingerne af objekter eller endda objektgrafer.

Som altid er koden tilgængelig på GitHub.