2012-02-10 33 views
31

Đối với một bài kiểm tra đơn vị, tôi cần mô phỏng một số phụ thuộc. Một trong những phụ thuộc là một lớp thực hiện giao diện:Chế nhạo một lớp so với chế nhạo giao diện của nó

public class DataAccessImpl implements DataAccess { 
    ... 
} 

Tôi cần phải thiết lập đối tượng giả định của lớp này trả về một số giá trị được chỉ định khi được cung cấp với một số thông số được chỉ định.

Bây giờ, những gì tôi không chắc chắn, là nếu nó tốt hơn để thử giao diện hoặc lớp, tức là

DataAccess client = mock(DataAccess.class); 

vs

DataAccess client = mock(DataAccessImpl.class); 

Liệu nó thực hiện bất kỳ sự khác biệt về vấn đề thử nghiệm? Cách tiếp cận ưa thích là gì?

+1

Dưới đây là một số suy nghĩ khác về các lớp chế nhạo. Nice read, imho: http://stackoverflow.com/questions/1595166/why-is-it-so-bad-to-mock-classes – guerda

Trả lời

38

Có thể không có nhiều khác biệt trong trường hợp của bạn nhưng cách tiếp cận ưa thích là giả lập giao diện, như bình thường nếu bạn làm theo TDD (Test Driven Development), bạn có thể viết các bài kiểm tra đơn vị ngay cả trước khi bạn viết các lớp thực hiện. Vì vậy, ngay cả khi bạn không có lớp bê tông DataAccessImpl, bạn vẫn có thể viết các bài kiểm tra đơn vị bằng cách sử dụng giao diện DataAccess của mình.

Hơn nữa, các khuôn khổ mocking có giới hạn trong các lớp mô phỏng và một số khung chỉ giả lập giao diện theo mặc định.

6

Điều đó tùy thuộc. Nếu mã của bạn phụ thuộc vào lớp và không phải trên giao diện, bạn phải giả lập lớp để viết một bài kiểm tra đơn vị hợp lệ.

+13

Hoặc nghe thử nghiệm và làm cho mã phụ thuộc vào một giao diện, vì nó có thể Nên. – blank

6

Trong hầu hết các trường hợp, về mặt kỹ thuật, không có sự khác biệt và bạn có thể giả làm lớp để giao diện. Về mặt khái niệm, tốt hơn là sử dụng các giao diện vì trừu tượng hóa tốt hơn.

2

Nếu bạn chỉ sử dụng nó thông qua giao diện và nó không phải là một mô hình một phần, không có sự khác biệt khác với cảm giác bên trong của bạn. Mocking lớp cũng sẽ giả sử phương thức công khai không được sử dụng nếu lớp có chúng, nhưng đó không phải là một vấn đề lớn để xem xét.

3

Bạn nên giả lập giao diện vì nó sẽ giúp đảm bảo bạn tuân thủ Nguyên tắc thay thế Liskov (https://stackoverflow.com/a/56904/3571100).

+0

Nó sẽ là thú vị để biết, làm thế nào bạn có thể đạt được điều này bằng cách chế nhạo giao diện? tôi có thể giả lập giao diện nhưng trong việc thực hiện lớp tôi có thể vi phạm Thay thế Liskov. – karlihnos

+0

@karlihnos liên kết tôi đã cung cấp các trạng thái "Hàm [...] phải có khả năng sử dụng các đối tượng của các lớp dẫn xuất mà không biết nó." nói cách khác chúng ta nên lập trình cho giao diện hơn là thực hiện. Vì vậy, trong lớp được thử nghiệm, chúng tôi có thể giúp để đạt được LSP bằng cách lập trình cho giao diện. Tất nhiên làm điều này không nói bất cứ điều gì về việc liệu bất kỳ triển khai giao diện giả lập sẽ tuân thủ LSP hay không. – jordan

Các vấn đề liên quan