Cả ba khái niệm Stub, Mock và Fake đều rất quan trọng trong unit test và gắn liền với định nghĩa về "de-coupled" architecture design. "de-coupling" architecture có mục đích chính là thiết kế phần mềm sao cho chúng ta có thể tách phần mềm ra thành các phần riêng biệt (các unit) mà không bị ảnh hưởng bởi các phần khác hoặc chỉ bị ảnh hưởng một cách tối thiểu.

Ví dụ, tôi có một class cần viết unit test và các class khác liên quan như kết nối DB hoặc call service api. Bây giờ, tôi muốn kiểm tra các class, nơi các đối tượng phụ thuộc là chưa sẵn sàng, vì vậy trong tình huống này, tôi cần phải thực hiện một đối tượng Mock hoặc Fake để kiểm tra class của tôi. Chúng ta sẽ bỏ qua thực tế hoạt động DB hoặc kết quả thực sự của việc call service. Theo cách này chúng ta có thể kiểm tra logic chính của class mà chúng ta cần thực hiện unit test.

 

1. Mock là gì?

Mock object (MO) là một đối tượng ảo mô phỏng các tính chất và hành vi giống hệt như đối tượng thực được truyền vào bên trong khối mã đang vận hành nhằm kiểm tra tính đúng đắn của các hoạt động bên trong. Mock object có các đặc điểm sau:

  • Đơn giản hơn đối tượng thực nhưng vẫn giữ được sự tương tác với các đối tượng khác.

  • Không lặp lại nội dung đối tượng thực.

  • Cho phép thiết lập các trạng thái riêng trợ giúp cho việc thực hiện unit test.

 

2. Stub là gì?

● Stub là một chương trình hoặc thành phần giả lập (thay thế cho chương trình hoặc thành phần chưa code xong để kiểm thử) nó dùng để kiểm thử... ví dụ, trong một dự án có 4 modules, nhưng đến lúc test mà còn một module chưa code xong, để test được thì cần phải có 4 modules này, vậy thì cần phải có một chương trình giả lập module này để thực hiện test. Chương trình giả lập cho module này được gọi là STUB.

Oh, cả hai đều có vẻ khó hiểu!

● Khi tôi bắt đầu tìm hiểu về unit test, tôi rất khó để phân biệt được Mock và Stub khác nhau như thế nào, cả hai đều rất giống nhau trong khái niệm. Nhưng một khi bạn hiểu đúng cách rồi thì bạn sẽ nhận ra sự khác biệt thực sự.

● Một Stub không thể trả về kết quả unit test là fail bởi vì bạn biết những gì bạn đang thực hiện và lý do tại sao bạn đang thực hiện nó, Nó được sử dụng là để thay thế cho một module và được giả sử là phải thực hiện đúng các nhiệm vụ được giao. Tuy nhiên, Mock object chỉ là một đối tượng mà bắt chước các đối tượng thực sự. Nếu logic chính của method là sai thì các unit test sẽ fail ngay cả khi chúng ta thiết lập mock object chính xác.

🌟Dưới đây là ví dụ về Stub API liên quan đến dự án mà mình đang làm, mọi người tham khảo nhé. 

Ví dụ: công ty mình đang làm một hệ thống bán hàng E-commerce và hệ thống này là một phần trong hệ thống chính của khách hàng.

   ⇨ Vì vậy, để  liên kết 2 hệ thống này, chúng mình cần phải thực hiện login SSO. 

     ⇨ Để login SSO thì lại cần có mã Token (một chuỗi ký tự đặc biệt đã được mã hoá). 

     ⇨ Vậy ai sẽ là người cung cấp Token này? Chính là Khách hàng của tụi mình - người yêu cầu tụi mình làm hệ thống này. 

Nhưng, trong quá trình phát triển, tụi mình sẽ tự tạo ra 1 FAKE TOKEN để thử nghiệm chức năng Login SSO vào hệ thống đã ổn áp chưa ⇨ Giai đoạn này mình sẽ dùng Stub API (API giả lập) để tạo ra FAKE TOKEN

Sau nhiều lần thử nghiệm và thấy đã đạt kết quả (tức là Login thành công vào hệ thống đấy) thì tụi mình sẽ yêu cầu khách hàng cung cấp REAL API (API thực tế) . 

Định nghĩa về Single sign on (SSO) mọi người có thể xem tại link dưới: 

https://viblo.asia/p/single-sign-on-sso-la-gi-hoat-dong-ra-sao-bWrZn4oQ5xw

 

Nói thì khó hiểu, mọi người có thể đọc sơ đồ minh hoạ dưới đây để dễ hiểu hơn nhé! 

 

 

3. Fake là gì?

Như chúng ta biết, ý nghĩa của Fake là giả, không thật. Đó là một ý nghĩa nói chung, nó có thể chỉ tới một một object thật hoặc một object giả hoặc giả hoặc một cái gì đó không có thật.

Vì vậy, Fake là một thuật ngữ chung chung, mà có thể trỏ đến bất cứ điều gì.