Unit testing với Spring Cloud Stream

Spring Cloud Stream cung cấp cho chúng ta dependency spring-cloud-stream-test-binder, giúp chúng ta có thể dễ dàng viết unit test cho các ứng dụng có sử dụng Spring Cloud Stream mà không cần phải gọi tới các message broker thật.

Các bạn có thể khai báo sử dụng dependency spring-cloud-stream-test-binder này như sau:

Mình sẽ sử dụng project ví dụ trong bài viết trước để làm ví dụ, các bạn nhé!

Để viết unit test cho Spring Cloud Stream, chúng ta sẽ annotate test class với annotation là @EnableTestBinder:

Annotation @EnableTestBinder sẽ đánh dấu để Spring tạo 2 bean là InputDestination và OutputDestination, giúp chúng ta có thể simulate việc gửi và nhận các message tới message broker với Spring Cloud Stream. InputDestination sẽ simulate việc nhận message từ message broker tới ứng dụng, còn OutputDestination thì sẽ simulate việc gửi message từ ứng dụng tới message broker, các bạn nhé!

Mình sẽ tạo mới tập tin application.yml nằm trong thư mục src/test/resources để sử dụng cho phần testing này!

InputDestination

Như mình đã nói ở trên, bean của class InputDestination sẽ simulate việc nhận message từ message broker tới ứng dụng.

Hiện tại thì trong project ví dụ, mình đã định nghĩa bean của interface Consumer để nhận message từ message broker:

Cho phần testing, để làm ví dụ cho phần assertion, mình sẽ thêm mới class MessageStore với annotation @Component:

để khi nhận message từ message broker, class MessageStore này sẽ ghi nhận message đó, như sau:

Mình sẽ định nghĩa binding cho interface Consumer này trong tập tin application.yml ở thư mục src/test/resources như sau:

Trong phần unit test, chúng ta sẽ ingest bean của class InputDestination, gửi message tới destination và assert kết quả như sau:

Phương thức send() của class InputDestination có 2 tham số. Tham số đầu tiên là message mà chúng ta muốn gửi, còn tham số thứ hai là tên của Exchange trong RabbitMQ hoặc là tên của Topic trong Apache Kafka mà ứng dụng sẽ nhận message, các bạn nhé! Class InputDestination này còn có 1 vài phương thức send() khác nhưng mình recommend các bạn sử dụng phương thức send() có 2 tham số như trên, để test chúng ta có thể work trong bất kỳ trường hợp nào.

Các bạn chạy test này, các bạn sẽ thấy kết quả pass như sau:

OutputDestination

Class OutputDestination sẽ simulate việc gửi message từ ứng dụng tới message broker.

Để làm ví dụ, các bạn có thể định nghĩa một bean của interface Supplier như mình đã làm trong bài viết trước như sau:

Định nghĩa binding cho nó:

Và các bạn có thể viết test sử dụng class OutputDestination như sau:

Phương thức receive() của class OutputDestination có 2 tham số là timeout và tên của Exchange hoặc Topic sẽ nhận message. Tương tự như class InputDestination, class OutputDestination này cũng có 1 vài phương thức receive() khác nhưng mình recommend các bạn sử dụng phương thức receive() có 2 tham số như trên, để test chúng ta có thể work trong bất kỳ trường hợp nào.

Kết quả khi chạy test này sẽ như sau:

Như vậy là trong bài viết này, mình đã hướng dẫn các bạn cách sử dụng 2 class là InputDestination và OutputDestination để viết unit test trong các ứng dụng có sử dụng Spring Cloud Stream. Việc không phải gọi tới external message broker khi chạy unit test sẽ giúp ích cho chúng ta rất nhiều đó các bạn!

Các bạn có thể xem thêm video ở đây:

Add Comment