Một ví dụ về trường hợp thất bại mà bạn có thể bắt trước, đó là đối tượng được kiểm tra sử dụng lớp bộ đệm nhưng không duy trì được dữ liệu theo yêu cầu. Sau đó, nếu bạn truy vấn đối tượng, nó sẽ nói "yup, tôi đã có tên và địa chỉ mới", nhưng bạn muốn thử nghiệm thất bại vì nó thực sự không thực hiện đúng như những gì nó được yêu cầu.
Ngoài ra (và xem xét vi phạm trách nhiệm đơn lẻ), giả sử bắt buộc phải duy trì phiên bản chuỗi được mã hóa UTF-8 cho trường theo hướng byte, nhưng thực tế vẫn tồn tại Shift JIS. Một số thành phần khác sẽ đọc cơ sở dữ liệu và hy vọng sẽ thấy UTF-8, do đó yêu cầu. Sau đó, chuyến đi khứ hồi qua đối tượng này sẽ báo cáo tên và địa chỉ chính xác vì nó sẽ chuyển đổi lại từ Shift JIS, nhưng lỗi không được phát hiện bởi bài kiểm tra của bạn. Nó hy vọng sẽ được phát hiện bởi một số thử nghiệm tích hợp sau này, nhưng toàn bộ điểm của các thử nghiệm đơn vị là bắt kịp các vấn đề và biết chính xác thành phần nào chịu trách nhiệm.
Nếu một trong số họ không làm những gì nó được yêu cầu, thì trường hợp thử nghiệm của chính nó sẽ thất bại và chúng tôi có thể sửa nó và chạy lại pin thử nghiệm.
Bạn không thể giả định điều này, bởi vì nếu bạn không cẩn thận, bạn sẽ viết một bộ các bài kiểm tra phụ thuộc lẫn nhau. "Nó có tiết kiệm không?" kiểm tra gọi phương thức lưu là kiểm tra và sau đó là phương thức tải để xác nhận đã lưu. "Nó có tải không?" kiểm tra gọi phương thức lưu để thiết lập lịch thi đấu và sau đó phương thức tải mà nó đang kiểm tra để kiểm tra kết quả. Cả hai thử nghiệm đều dựa vào tính chính xác của phương pháp mà họ không thử nghiệm, nghĩa là cả hai thử nghiệm đều không thực sự kiểm tra tính chính xác của phương pháp mà nó đang thử nghiệm.
Manh mối cho thấy có một vấn đề ở đây, đó là hai bài kiểm tra được cho là đang kiểm tra các đơn vị khác nhau thực sự làm cùng một việc . Cả hai đều gọi một setter theo sau là getter, sau đó kiểm tra kết quả là giá trị ban đầu. Nhưng bạn muốn kiểm tra rằng setter vẫn lưu giữ dữ liệu chứ không phải cặp setter / getter hoạt động cùng nhau. Vì vậy, bạn biết điều gì đó sai, bạn chỉ cần tìm ra những gì và sửa chữa các bài kiểm tra.
Nếu mã của bạn được thiết kế tốt để kiểm tra đơn vị, thì có ít nhất hai cách bạn có thể kiểm tra xem dữ liệu có thực sự được duy trì chính xác theo phương pháp được kiểm tra hay không:
mô phỏng giao diện cơ sở dữ liệu và yêu cầu bản ghi giả của bạn thực tế rằng các hàm thích hợp đã được gọi trên đó, với các giá trị dự kiến. Phương pháp này kiểm tra phương thức thực hiện những gì nó được yêu cầu và là thử nghiệm đơn vị cổ điển.
vượt qua nó một cơ sở dữ liệu thực tế với cùng một ý định , để ghi lại liệu dữ liệu có được duy trì chính xác hay không. Nhưng thay vì có một chức năng bị chế giễu chỉ nói "yup, tôi đã lấy đúng dữ liệu", bài kiểm tra của bạn sẽ đọc trực tiếp ra khỏi cơ sở dữ liệu và xác nhận nó đúng. Đây có thể không phải là thử nghiệm thuần túy nhất có thể, bởi vì toàn bộ công cụ cơ sở dữ liệu là một thứ khá lớn để sử dụng để viết một bản giả được tôn vinh, với nhiều khả năng tôi nhìn ra một số tinh tế khiến cho bài kiểm tra vượt qua mặc dù có gì đó không đúng (ví dụ như tôi không nên sử dụng cùng một kết nối cơ sở dữ liệu để đọc như đã được sử dụng để viết, bởi vì tôi có thể thấy một giao dịch không được cam kết). Nhưng nó kiểm tra đúng, và ít nhất bạn biết rằng nó chính xác thực hiện toàn bộ giao diện cơ sở dữ liệu mà không phải viết bất kỳ mã giả nào!
Vì vậy, đây chỉ là một chi tiết của việc thực hiện kiểm tra cho dù tôi đọc dữ liệu ra khỏi cơ sở dữ liệu kiểm tra bằng JDBC hay liệu tôi có chế nhạo cơ sở dữ liệu hay không. Dù bằng cách nào đi nữa, tôi có thể kiểm tra đơn vị tốt hơn bằng cách cách ly nó hơn tôi có thể nếu tôi cho phép nó âm mưu với các phương thức không chính xác khác trên cùng một lớp để nhìn đúng ngay cả khi có gì đó không đúng. Do đó, tôi muốn sử dụng bất kỳ phương tiện thuận tiện nào để kiểm tra xem dữ liệu chính xác có còn tồn tại không, ngoài việc tin tưởng vào thành phần mà phương thức tôi đang thử nghiệm.
Nếu mã của bạn không được thiết kế tốt để kiểm tra đơn vị, thì bạn có thể không có lựa chọn nào, bởi vì đối tượng có phương thức bạn muốn kiểm tra có thể không chấp nhận cơ sở dữ liệu dưới dạng phụ thuộc được chèn. Trong trường hợp đó, cuộc thảo luận về cách tốt nhất để cách ly thiết bị được thử nghiệm, sẽ chuyển sang một cuộc thảo luận về mức độ gần gũi để có thể cách ly thiết bị được thử. Kết luận là như nhau, mặc dù. Nếu bạn có thể tránh được âm mưu giữa các đơn vị bị lỗi thì bạn hãy làm theo thời gian có sẵn và bất cứ điều gì khác mà bạn nghĩ về điều đó sẽ hiệu quả hơn trong việc tìm ra lỗi trong mã.