Inleiding tot JaVers

1. Overzicht

In dit artikel zullen we kijken naar de JaVers bibliotheek.

Deze bibliotheek helpt programmeurs veranderingen in de status van eenvoudige Java-objecten te onderzoeken en te detecteren. Wanneer we veranderlijke objecten in onze code gebruiken, kan elk object potentieel op verschillende plaatsen in de applicatie worden gewijzigd; JaVers zou ons helpen deze veranderingen te ontdekken en te controleren.

2. Maven Afhankelijkheid

Laten we om te beginnen het javers-core Maven afhankelijkheid van onze pom.xml:

 org.javers javers-core 3.1.0 

We kunnen de nieuwste versie vinden op Maven Central.

3. Detectie van POJO-statuswijzigingen

Laten we beginnen met een simpele Persoon klasse:

openbare klasse Persoon {privé Geheel getal-id; private String naam; // standaard getters / constructors}

Stel dat we een Persoon object in een deel van onze applicatie, en in een ander deel van de codebase, de naam van de persoon met dezelfde ID veld is gewijzigd. We willen ze vergelijken om erachter te komen wat voor soort veranderingen er met het persoonsobject zijn gebeurd.

We kunnen die twee objecten vergelijken met de vergelijken() methode van de JaVers klasse:

@Test openbare leegte gegevenPersonObject_whenApplyModificationOnIt_thenShouldDetectChange () {// gezien Javers javers = JaversBuilder.javers (). Build (); Persoon persoon = nieuwe persoon (1, "Michael-programma"); Persoon personAfterModification = nieuwe persoon (1, "Michael Java"); // when Diff diff = javers.compare (person, personAfterModification); // dan ValueChange change = diff.getChangesByType (ValueChange.class) .get (0); assertThat (diff.getChanges ()). hasSize (1); assertThat (change.getPropertyName ()). isEqualTo ("naam"); assertThat (change.getLeft ()). isEqualTo ("Michael Program"); assertThat (change.getRight ()). isEqualTo ("Michael Java"); }

4. Statuswijziging van lijst met objecten detecteren

Als we werken met verzamelingen objecten, moeten we op dezelfde manier toestandsveranderingen onderzoeken door naar elk element in de verzameling te kijken. Soms willen we het specifieke object aan de lijst toevoegen of eruit verwijderen en de staat ervan wijzigen.

Laten we een voorbeeld bekijken; stel dat we een lijst met objecten hebben, en we verwijderen één object uit die lijst.

Die wijziging kan om de een of andere reden ongewenst zijn, en we willen de wijzigingen die in deze lijst zijn opgetreden, controleren. JaVers stelt ons in staat om dit te doen door een vergelijkCollecties () methode:

@Test openbare leegte gegevenListOfPersons_whenCompare_ThenShouldDetectChanges () {// gezien Javers javers = JaversBuilder.javers (). Build (); Persoon personThatWillBeRemoved = nieuwe persoon (2, "Thomas Link"); List oldList = Lists.asList (nieuwe persoon (1, "Michael Program"), personThatWillBeRemoved); List newList = Lists.asList (nieuwe persoon (1, "Michael niet programma")); // wanneer Diff diff = javers.compareCollections (oldList, newList, Person.class); // dan assertThat (diff.getChanges ()). hasSize (3); ValueChange valueChange = diff.getChangesByType (ValueChange.class) .get (0); assertThat (valueChange.getPropertyName ()). isEqualTo ("naam"); assertThat (valueChange.getLeft ()). isEqualTo ("Michael Program"); assertThat (valueChange.getRight ()). isEqualTo ("Michael niet programma"); 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. Objectgrafieken vergelijken

In echte woordtoepassingen hebben we vaak te maken met de objectgrafieken. Laten we zeggen dat we een PersonWithAddress klasse met een lijst met de Adres objecten en we voegen een nieuw adres toe voor de opgegeven persoon.

We kunnen gemakkelijk het type wijziging vinden dat heeft plaatsgevonden:

@Test openbare leegte gegevenListOfPerson_whenPersonHasNewAddress_thenDetectThatChange () {// gezien Javers javers = JaversBuilder.javers (). Build (); PersonWithAddress person = new PersonWithAddress (1, "Tom", Arrays.asList (nieuw adres ("Engeland"))); PersonWithAddress personWithNewAddress = nieuw PersonWithAddress (1, "Tom", Arrays.asList (nieuw adres ("Engeland"), nieuw adres ("VS"))); // when Diff diff = javers.compare (person, personWithNewAddress); Lijst objectenByChangeType = diff.getObjectsByChangeType (NewObject.class); // dan assertThat (objectsByChangeType) .hasSize (1); assertThat (objectsByChangeType.get (0) .equals (new Address ("USA"))); }

Evenzo wordt het verwijderen van een adres gedetecteerd:

@Test openbare leegte gegevenListOfPerson_whenPersonRemovedAddress_thenDetectThatChange () {// gezien Javers javers = JaversBuilder.javers (). Build (); PersonWithAddress person = new PersonWithAddress (1, "Tom", Arrays.asList (nieuw adres ("Engeland"))); PersonWithAddress personWithNewAddress = nieuwe PersonWithAddress (1, "Tom", Collections.emptyList ()); // when Diff diff = javers.compare (person, personWithNewAddress); Lijst objectsByChangeType = diff.getObjectsByChangeType (ObjectRemoved.class); // dan assertThat (objectsByChangeType) .hasSize (1); assertThat (objectsByChangeType.get (0) .equals (nieuw adres ("Engeland"))); }

6. Conclusie

In dit korte artikel hebben we de JaVers-bibliotheek gebruikt, een handige bibliotheek die ons API's geeft voor het detecteren van statusveranderingen in onze objecten. Het kan niet alleen de verandering in een eenvoudig POJO-object detecteren, maar het kan ook meer complexe verschuivingen in de verzamelingen objecten of zelfs in objectgrafieken detecteren.

Zoals altijd is de code beschikbaar op GitHub.


$config[zx-auto] not found$config[zx-overlay] not found