Dựa trên câu trả lời của Christian, theo hiểu biết tốt nhất của tôi, thuật ngữ đường may bắt nguồn từ cuốn sách của Feathers, hoạt động hiệu quả với Bộ luật kế thừa . Định nghĩa nằm ở trang 31:
Đường may là nơi bạn có thể thay đổi hành vi trong chương trình của mình mà không cần chỉnh sửa ở nơi đó.
Để đưa ra các ví dụ về đường may là gì và không phải là gì, hãy xem xét mã Java sau:
public class MyClass {
private final Foo foo;
public MyClass(Foo foo) {
this.foo = foo;
}
public void doBunchOfStuff(BarFactory barFactory) {
// foo.doStuff() is a seam because I can inject a mock instance of Foo
this.foo.doStuff();
// barFactory.makeBars() is a seam because I can replace the default
// BarFactory instance with something else during testing
List<Bar> bars = barFactory.makeBars();
for(Bar bar : bars) {
// bar.cut() is also a seam because if I can mock out BarFactory, then
// I can get the mocked BarFactory to return mocked Bars.
bar.cut();
}
// MyStaticClass.staticCall() is not a seam because I cannot replace
// staticCall() with different behavior without calling a class besides
// MyStaticClass, or changing the code in MyStaticClass.
MyStaticClass.staticCall();
// This is not a seam either because I can't change the behavior of what
// happens when instanceCall() occurs with out changing this method or
// the code in instanceCall().
(new MyInstanceClass()).instanceCall();
}
}
Các đường nối được minh họa ở trên sẽ là các đường nối trừ khi:
- Các lớp được tiêm là cuối cùng.
- Phương pháp đang được gọi là cuối cùng.
Về cơ bản, các đường nối tạo điều kiện cho thử nghiệm đơn vị. Tôi không thể viết bài kiểm tra đơn vị MyClass
vì các cuộc gọi đến MyStaticClass.staticCall()
và (new MyInstanceClass()).instanceCall()
. Bất kỳ thử nghiệm đơn vị cho MyClass
's doBunchOfStuff()
phương pháp sẽ phải kiểm tra MyStaticClass.staticCall()
và (new MyInstanceClass()).instanceCall()
và tất cả các phụ thuộc của họ mà có được gọi. Ngược lại, bằng cách sử dụng các lớp không phải là cuối cùng với các phương thức không phải là cuối cùng (hoặc tốt hơn - các giao diện), các thể hiện được đưa vào Foo
và BarFactory
thực hiện các bài kiểm tra đơn vị để MyClass
có thể viết bằng cách tạo điều kiện cho việc chế nhạo.