Christian'ın cevabına dayanarak, bilgim dahilinde, dikiş terimi , Eski Kod ile Etkili Çalışma , Tüylerin kitabından kaynaklanmaktadır . Tanım 31. sayfadadır:
Bir dikiş, o yerde düzenleme yapmadan programınızdaki davranışı değiştirebileceğiniz bir yerdir.
Bir dikişin ne olduğuna ve ne olmadığına dair örnekler vermek için aşağıdaki Java kodunu göz önünde bulundurun:
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();
}
}
Yukarıda örneklenen dikişler, aşağıdakiler olmadıkça dikişler olacaktır:
- Enjekte edilen sınıf kesindir.
- Çağrılan yöntem kesindir.
Temel olarak, dikişler ünite testini kolaylaştırır. Ben için bir birim test yazamıyor MyClass
çünkü aramaların MyStaticClass.staticCall()
ve (new MyInstanceClass()).instanceCall()
. İçin herhangi bir birim test MyClass
bireyin doBunchOfStuff()
yönteme testine olurdu MyStaticClass.staticCall()
ve (new MyInstanceClass()).instanceCall()
ve tüm denilen olsun onların bağımlılıkları. Tersine, final dışı sınıfları final dışı yöntemlerle (veya daha iyisi - arayüzlerle) kullanarak, enjekte edilen örnekleri Foo
ve alay işlemlerini kolaylaştırarak yazma BarFactory
için birim testleri yapmak MyClass
.