Pengenalan kepada JaVers

1. Gambaran keseluruhan

Dalam artikel ini, kita akan melihat perpustakaan JaVers .

Perpustakaan ini membantu pengaturcara memeriksa dan mengesan perubahan keadaan objek Java sederhana. Apabila kita menggunakan objek yang dapat diubah dalam kod kita, setiap objek berpotensi diubahsuai di berbagai tempat dalam aplikasi; JaVers akan membantu kami menemui dan mengaudit perubahan ini .

2. Ketergantungan Maven

Untuk memulakan, mari kita tambahkan kebergantungan javers-core Maven ke pom.xml kami :

 org.javers javers-core 3.1.0 

Kita boleh mendapatkan versi terbaru di Maven Central.

3. Mengesan Perubahan Negeri POJO

Mari mulakan dengan kelas Orang sederhana :

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

Anggaplah kita membuat objek Person di satu bahagian aplikasi kita, dan di bahagian lain dari codebase, nama orang dengan bidang id yang sama telah diubah. Kami ingin membandingkannya untuk mengetahui jenis perubahan yang berlaku pada objek orang tersebut.

Kita boleh membandingkan kedua objek tersebut menggunakan kaedah membandingkan () dari kelas 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. Mengesan Perubahan Negeri Senarai Objek

Sekiranya kita bekerja dengan koleksi objek, kita juga perlu memeriksa perubahan keadaan dengan melihat setiap elemen dalam koleksi. Kadang-kadang, kita mahu menambah atau membuang objek tertentu dari senarai, mengubah keadaannya.

Mari kita lihat contohnya ; katakan kita mempunyai senarai objek, dan kita membuang satu objek dari senarai itu.

Perubahan itu mungkin tidak diingini kerana beberapa sebab, dan kami ingin mengaudit perubahan yang berlaku dalam senarai ini. JaVers membolehkan kita melakukannya dengan menggunakan kaedah membandingkanCollections () :

@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. Membandingkan Graf Objek

Dalam aplikasi kata sebenar, kita sering menangani grafik objek. Katakan bahawa kita mempunyai kelas PersonWithAddress yang mempunyai senarai objek Alamat dan kita menambah alamat baru untuk orang yang diberikan.

Kita dapat dengan mudah mengetahui jenis perubahan yang berlaku:

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

Begitu juga, membuang alamat akan dikesan:

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

Dalam artikel ringkas ini, kami menggunakan perpustakaan JaVers, perpustakaan berguna yang memberi kami API untuk mengesan perubahan keadaan pada objek kami. Bukan hanya dapat mengesan perubahan pada objek POJO yang sederhana, tetapi juga dapat mengesan pergeseran yang lebih kompleks dalam koleksi objek, atau bahkan grafik objek.

Seperti biasa, kodnya tersedia di GitHub.