Uvod u JaVers

1. Pregled

U ovom ćemo članku pogledati JaVers knjižnica.

Ova knjižnica pomaže programerima da ispitaju i otkriju promjene stanja jednostavnih Java objekata. Kada u svom kodu koristimo promjenjive objekte, svaki objekt može se potencijalno modificirati na raznim mjestima u aplikaciji; JaVers pomogao bi nam otkriti i revidirati ove promjene.

2. Ovisnost Mavena

Za početak dodajmo javers-core Mavenova ovisnost o našoj pom.xml:

 org.javers javers-core 3.1.0 

Najnoviju verziju možemo pronaći na Maven Central.

3. Otkrivanje promjena stanja POJO

Počnimo s jednostavnim Osoba razred:

javna klasa Osoba {private Integer id; privatni naziv niza; // standardni getteri / konstruktori}

Pretpostavimo da smo stvorili a Osoba objekt u jednom dijelu naše aplikacije, a u nekom drugom dijelu baze podataka, naziv osoba s istim id polje je promijenjeno. Želimo ih usporediti kako bismo saznali kakve su se promjene dogodile na objektu osobe.

Ta dva objekta možemo usporediti pomoću usporedi () metoda iz JaVers razred:

@Test javna praznina givenPersonObject_whenApplyModificationOnIt_thenShouldDetectChange () {// dana Javers javers = JaversBuilder.javers (). Build (); Osoba osoba = nova osoba (1, "Michael program"); Osoba personAfterModification = nova osoba (1, "Michael Java"); // kada je Diff diff = javers.compare (person, personAfterModification); // tada ValueChange promjena = diff.getChangesByType (ValueChange.class) .get (0); assertThat (diff.getChanges ()). hasSize (1); assertThat (change.getPropertyName ()). isEqualTo ("ime"); assertThat (change.getLeft ()). isEqualTo ("Michael program"); assertThat (change.getRight ()). isEqualTo ("Michael Java"); }

4. Otkrivanje promjene stanja popisa objekata u državi

Ako radimo s zbirkama objekata, na sličan način moramo ispitati promjene stanja promatrajući svaki element u zbirci. Ponekad želimo dodati ili ukloniti određeni objekt s popisa, mijenjajući njegovo stanje.

Pogledajmo primjer; recimo da imamo popis objekata i mi uklanjamo jedan objekt s tog popisa.

Ta promjena iz nekog razloga može biti nepoželjna, a mi želimo revidirati promjene koje su se dogodile na ovom popisu. JaVers nam omogućuje da to učinimo pomoću a compareCollections () metoda:

@Test javna praznina givenListOfPersons_whenCompare_ThenShouldDetectChanges () {// dana Javers javers = JaversBuilder.javers (). Build (); Person personThatWillBeRemoved = nova osoba (2, "Thomas Link"); Popis oldList = Lists.asList (nova Osoba (1, "Michael program"), personThatWillBeRemoved); Popis newList = Lists.asList (nova osoba (1, "Michael Not Program")); // kada je Diff diff = javers.compareCollections (oldList, newList, Person.class); // zatim assertThat (diff.getChanges ()). hasSize (3); ValueChange valueChange = diff.getChangesByType (ValueChange.class) .get (0); assertThat (valueChange.getPropertyName ()). isEqualTo ("ime"); assertThat (valueChange.getLeft ()). isEqualTo ("Michael program"); assertThat (valueChange.getRight ()). isEqualTo ("Michael nije program"); ObjectRemoved objectRemoved = diff.getChangesByType (ObjectRemoved.class) .get (0); assertThat (objectRemoved.getAffectedObject (). get (). jednako (personThatWillBeRemoved)) .isTrue (); ListChange listChange = diff.getChangesByType (ListChange.class) .get (0); assertThat (listChange.getValueRemovedChanges (). size ()). isEqualTo (1); }

5. Usporedba grafikona objekata

U stvarnim aplikacijama riječi često imamo posla s objektnim grafikonima. Recimo da imamo a PersonWithAddress klasa koja ima popis Adresa objekata i dodajemo novu adresu za datu osobu.

Lako možemo pronaći vrstu promjene koja se dogodila:

@Test javna praznina givenListOfPerson_whenPersonHasNewAddress_thenDetectThatChange () {// dana Javers javers = JaversBuilder.javers (). Build (); PersonWithAddress person = new PersonWithAddress (1, "Tom", Arrays.asList (nova adresa ("Engleska"))); PersonWithAddress personWithNewAddress = new PersonWithAddress (1, "Tom", Arrays.asList (nova adresa ("Engleska"), nova adresa ("SAD"))); // kada je Diff diff = javers.compare (person, personWithNewAddress); Popis objekataByChangeType = diff.getObjectsByChangeType (NewObject.class); // zatim assertThat (objectsByChangeType) .hasSize (1); assertThat (objectsByChangeType.get (0) .equals (nova adresa ("USA"))); }

Slično će se otkriti uklanjanje adrese:

@Test javna praznina givenListOfPerson_whenPersonRemovedAddress_thenDetectThatChange () {// dana Javers javers = JaversBuilder.javers (). Build (); PersonWithAddress person = new PersonWithAddress (1, "Tom", Arrays.asList (nova adresa ("Engleska"))); PersonWithAddress personWithNewAddress = novi PersonWithAddress (1, "Tom", Collections.emptyList ()); // kada je Diff diff = javers.compare (person, personWithNewAddress); Popis objekataByChangeType = diff.getObjectsByChangeType (ObjectRemoved.class); // zatim assertThat (objectsByChangeType) .hasSize (1); assertThat (objectsByChangeType.get (0) .equals (nova adresa ("Engleska"))); }

6. Zaključak

U ovom kratkom članku koristili smo JaVers knjižnicu, korisnu knjižnicu koja nam daje API-je za otkrivanje promjena stanja u našim objektima. Ne samo da može otkriti promjenu na jednostavnom POJO objektu, već također može otkriti složenije pomake u zbirkama objekata ili čak grafikonima objekata.

Kao i uvijek, kôd je dostupan na GitHub-u.


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