
Dalam catatan ini saya akan menunjukkan kepada anda cara menulis ujian unit dalam aplikasi boot musim bunga.
Mengapa perlu menulis ujian unit memerlukan artikel lain untuk dijelaskan. Tetapi untuk penjelasan ringkas, saya akan memberitahu anda beberapa perkara.
Saya biasanya mempertahankan hujah bahawa kod tanpa ujian unit adalah kod mati. Kerana, apabila pembangun menambahkan ciri baru pada beberapa kod yang tidak dilindungi oleh ujian unit, ia cenderung untuk mengatasi peraturan perniagaan yang ada (yang membunuh kod yang ditulis sebelumnya). Mungkin ia tidak betul-betul rentan terhadapnya, tetapi anda dapat membayangkan kesalahan apa yang boleh berlaku apabila projek yang kompleks perlu diubah. Ujian unit adalah satu-satunya cara untuk melindungi kod anda daripada melanggar perubahan.
Mengapa titik akhir ujian unit?
Setiap kali kita menulis titik akhir kita perlu memastikan beberapa perkara berfungsi dengan betul. Titik akhir harus mengembalikan data dalam struktur yang betul dan menangani permintaan dengan betul. Kita boleh mengujinya secara manual, yang tidak digemari. Oleh itu, kami menulis ujian unit untuk memastikan bahawa titik akhir kami berfungsi dengan betul. Terdapat juga cara lain untuk menguji titik akhir yang dikenali sebagai ujian automasi, tetapi itu bukan tajuk siaran ini.
Mengapa perkhidmatan ujian unit?
Sudah semestinya jelas, tetapi untuk berjaga-jaga: kita perlu memastikan logik perniagaan kita berfungsi dengan betul.
Mengapa repositori ujian unit?
Terdapat beberapa kes untuk menguji repositori. Sudah tentu kita tidak menguji kerangka itu sendiri. Tetapi kami melakukan ujian unit tulis untuk memastikan bahawa spesifikasi atau hubungan kami telah dilaksanakan dengan betul.
Jadi bagaimana kita menguji pengawal?
Kini tiba masanya untuk menunjukkan kepada anda bagaimana untuk menguji pengawal kami pada musim bunga. Bayangkan kita menulis aplikasi yang membolehkan kita menyimpan pengguna dalam pangkalan data. Kami menentukan entiti pengguna, perkhidmatan pengguna, dan pengawal.
Catatan: Contoh yang ditunjukkan dalam catatan ini bukan untuk seni bina penggunaan pengeluaran sebenar
@[email protected] class User { @Id @GeneratedValue(generator = "uuid2") @GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator") @Column(name = "id", columnDefinition = "BINARY(16)") private UUID id; private String name; private String email; private int age;}
@Datapublic class CreateUserRequest { private String name; private String email; private int age;}
@[email protected]("/users")public class UserController { UserService userService; @Autowired public UserController(UserService userService) { this.userService = userService; } @PostMapping public ResponseEntity createUser(@RequestBody CreateUserRequest request) { User created = userService.save(request); return ResponseEntity.ok(created); }}
Pengawal kami mempunyai kebergantungan pada UserService tetapi kami tidak berminat dengan perkhidmatan yang dilakukan sekarang.
Jadi sekarang mari kita tulis ujian unit untuk pengawal kami untuk memastikan ia berfungsi dengan betul.

Kami mengejek perkhidmatan kami kerana kami tidak memerlukan perincian pelaksanaannya. Kami hanya menguji alat kawalan kami di sini. Kami gunakan MockMvc
di sini untuk menguji pengawal dan pemeta objek kami untuk tujuan bersiri.
Kami userService.Save()
menetapkan kaedah kami untuk mengembalikan objek pengguna yang diinginkan. Kita telah meluluskan permintaan untuk pengawal kami dan selepas itu kami memeriksa data itu kembali dengan baris berikut: andExpect(jsonPath("$.name").value(request.getName()))
.
Kami juga mempunyai kaedah lain untuk digunakan. Berikut adalah senarai kaedah:

Semasa kita menjalankan ujian, kita melihat bahawa ia lulus.

Bagaimana kita menguji perkhidmatan?
Sekarang kita pergi untuk menguji Perkhidmatan Pengguna kami. Ia cukup mudah untuk diuji.

Kami mengejek repositori dan memasukkan ejekan kami ke dalam UserService. Sekarang semasa kita menjalankan ujian, kita akan melihat bahawa ia lulus.
Sekarang mari kita tambahkan peraturan perniagaan ke UserService: katakan pengguna mesti mempunyai alamat e-mel.
Kami mengubah kaedah simpan kami di UserService seperti di bawah:
public User save(CreateUserRequest request) { requireNonNull(request.getEmail()); User user = new User(); user.setName(request.getName()); user.setEmail(request.getEmail()); user.setAge(request.getAge()); userRepository.save(user); return user;}
Apabila kita menjalankan ujian lagi, kita akan melihat ujian yang gagal.

Sebelum kita memperbaikinya, mari tulis ujian yang memuaskan perniagaan ini.

Kami menulis ujian baru yang menyatakan bahawa jika kami menghantar e-mel kosong, ia akan dilemparkan NullPointerException.
Mari perbaiki ujian yang gagal dengan menambahkan e-mel pada permintaan kami:
createUserRequest.setEmail("testemail");
Jalankan kedua-dua ujian:

Bagaimana kita menguji repositori?
Sekarang kami telah menguji repositori. Kami menggunakan pangkalan data dalam memori h2 denganTestEntityManager.
Repositori kami ditakrifkan seperti di bawah:
@Repositorypublic interface UserRepository extends JpaRepository, JpaSpecificationExecutor { Optional findById(UUID id);}
Mengkonfigurasi h2db pertama. Buat nama file application.yaml dalam ujian -> jalan sumber:
spring: application: name: Spring Boot Rest API datasource: type: com.zaxxer.hikari.HikariDataSource url: "jdbc:h2:mem:test-api;INIT=CREATE SCHEMA IF NOT EXISTS dbo\\;CREATE SCHEMA IF NOT EXISTS definitions;DATABASE_TO_UPPER=false;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false;MODE=MSSQLServer" name: password: username: initialization-mode: never hikari: schema: dbo jpa: database: H2 database-platform: org.hibernate.dialect.H2Dialect show-sql: true hibernate: ddl-auto: create-drop test: database: replace: none
Dan mari kita tulis dulu ujian asas untuk repositori kami: selamatkan pengguna dan dapatkannya:
@RunWith(SpringRunner.class)@DataJpaTestpublic class UserRepositoryTest { @Autowired TestEntityManager entityManager; @Autowired UserRepository sut; @Test public void it_should_save_user() { User user = new User(); user.setName("test user"); user = entityManager.persistAndFlush(user); assertThat(sut.findById(user.getId()).get()).isEqualTo(user); }}
Semasa kami menjalankannya, kami akan melihat banyak output konsol, dan juga ujian kami lulus:

Sekarang mari kita tambahkan kaedah lain ke repositori kami untuk mencari pengguna melalui e-mel:
Optional findByEmail(String email);
Dan tulis ujian lain:
@Testpublic void it_should_find_user_byEmail() { User user = new User(); user.setEmail("[email protected]"); user = entityManager.persistAndFlush(user); assertThat(sut.findByEmail(user.getEmail()).get()).isEqualTo(user);}
Apabila kita melihat konsol setelah menjalankan ujian, kita akan melihat SQL yang dihasilkan oleh hibernate:
SELECT user0_.id AS id1_1_,user0_.age AS age2_1_,user0_.email AS email3_1_,user0_.name AS name4_1_FROM user user0_WHERE user0_.email=?

Setakat ini begitu baik. Kami telah merangkumi asas pengujian unit dengan spring spring.
Now you don’t have any excuses to not write unit tests! I hope it is clear to you to how to write unit tests for different kinds of purposes.