Để thực hiện các thử nghiệm đơn giản, việc nhét lớp truy cập cơ sở dữ liệu là hoàn toàn chấp nhận được. Bạn gọi getName()
, nó gọi DAO đã bị chế giễu và trả lại "John" cho tên đầu tiên và "Smith" cho tên cuối cùng, lắp ráp chúng và mọi thứ đều hoàn hảo. Không cần phải thực sự đơn vị kiểm tra một cơ sở dữ liệu ở đó.
Mọi thứ trở nên phức tạp hơn một chút khi logic trở nên phức tạp hơn một chút. Điều gì sẽ xảy ra nếu bạn có một phương thức "createdOrUpdateUser (...)". Nếu bạn giả định cơ sở dữ liệu, bạn có thể xác minh rằng một phương thức đã cho đã được gọi một lần với một tham số nhất định khi giả định trả về không có đối tượng và một phương thức khác được gọi trên cơ sở dữ liệu khi nó trả về một đối tượng hiện có. Điều này bắt đầu đi đến dòng mờ nơi mà nó có thể dễ dàng hơn (đặc biệt là nếu nó đã có) để tạo ra một cơ sở dữ liệu bộ nhớ chuyên dụng và kiểm tra mã đó với dữ liệu được cấu hình sẵn.
Trong một số mã thực tế tôi đã làm việc (điểm bán hàng), chúng tôi đã có một resumeSuspededTransaction(...)
phương pháp. Điều này sẽ kéo giao dịch từ cơ sở dữ liệu vào một đối tượng (và các thành phần của nó) và cập nhật cơ sở dữ liệu. Chúng tôi đã chế giễu và một lỗi đã ẩn trong mã ở đâu đó với việc tuần tự hóa và giải tuần tự hóa dữ liệu đi đến cơ sở dữ liệu (chúng tôi đã thay đổi một loại được tuần tự hóa khác nhau trên cơ sở dữ liệu).
Giả đã không cho chúng ta thấy lỗi vì nó đang trả lại con đường hạnh phúc của nó - tuần tự hóa giao dịch, lưu trữ nó trong giả, giải tuần tự hóa nó khỏi giả, kiểm tra xem chúng có bằng nhau không. Tuy nhiên, khi bạn tuần tự hóa một đối tượng có số 0 dẫn đến cơ sở dữ liệu, nó sẽ thả chúng và sau đó kết hợp lại thành một chuỗi không có số không. Chúng tôi đã bắt lỗi mà không có cơ sở dữ liệu thông qua khắc phục sự cố (không khó để phát hiện ra một khi chúng tôi biết nó ở đó).
Sau đó, chúng tôi đặt một cơ sở dữ liệu vào đó và nhận ra rằng lỗi sẽ không bao giờ vượt qua bài kiểm tra cơ sở đó nếu chúng ta thay vào đó là đi đến cơ sở dữ liệu bộ nhớ.
Trong cơ sở dữ liệu bộ nhớ có những ưu điểm:
- chúng có thể được tạo ra nhanh chóng (mà không cần DBA để thiết lập tài khoản, bảng và như vậy) để thử nghiệm
- dữ liệu có thể được cấu hình sẵn cho thử nghiệm đó
- bài kiểm tra không cần phải lo lắng về việc hoàn thành bài kiểm tra khi hoàn thành
- mỗi bài kiểm tra có cơ sở dữ liệu bộ nhớ riêng, do đó bạn không phải lo lắng nếu hai bài kiểm tra đang chạy cùng một lúc
- chúng có thể được chạy trên các hệ thống không có kết nối với cơ sở dữ liệu thực