Berdasarkan jawaban Christian, setahu saya, istilah jahitan memang berasal dari buku Feathers, Bekerja Efektif dengan Legacy Code . Definisi ada di halaman 31:
Jahitan adalah tempat di mana Anda dapat mengubah perilaku di program Anda tanpa mengedit di tempat itu.
Untuk memberikan contoh apa itu jahitan dan apa yang bukan, pertimbangkan kode Java berikut:
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();
}
}
Jahitan yang dicontohkan di atas adalah jahitan kecuali:
- Kelas yang disuntikkan adalah final.
- Metode yang dipanggil adalah final.
Pada dasarnya, jahitan memudahkan pengujian unit. Saya tidak dapat menulis unit test MyClass
karena panggilan ke MyStaticClass.staticCall()
dan (new MyInstanceClass()).instanceCall()
. Setiap unit test untuk MyClass
's doBunchOfStuff()
metode harus tes MyStaticClass.staticCall()
dan (new MyInstanceClass()).instanceCall()
dan semua dependensi mereka yang dipanggil. Sebaliknya, dengan menggunakan kelas-kelas non-final dengan metode-metode non-final (atau antarmuka yang lebih baik lagi), contoh-contoh yang disuntikkan dari Foo
dan BarFactory
membuat unit test untuk MyClass
memungkinkan untuk menulis dengan memfasilitasi mengejek.