Basandosi sulla risposta di Christian, per quanto ne so, il termine cucitura deriva dal libro di Piume, funzionante in modo efficace con Codice precedente . La definizione è a pagina 31:
A seam is a place where you can alter behavior in your program without editing in that place.
Per dare esempi di cosa sia una cucitura e cosa non sia, si consideri il seguente codice Java:
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();
}
}
Le giunzioni di cui sopra sarebbero cuciture a meno che:
- La classe che viene iniettata è definitiva.
- Il metodo chiamato è definitivo.
Fondamentalmente, le cuciture facilitano il test dell'unità. Non riesco a scrivere un test unitario per MyClass
a causa delle chiamate a MyStaticClass.staticCall()
e (new MyInstanceClass()).instanceCall()
. Qualsiasi test unitario per il MyClass
del metodo doBunchOfStuff()
dovrebbe testare MyStaticClass.staticCall()
e (new MyInstanceClass()).instanceCall()
e tutti delle loro dipendenze che vengono richiamati. Viceversa, utilizzando le classi non final con metodi non finali (o, meglio ancora, interfacce), le istanze iniettate di Foo
e BarFactory
rendono i test unitari per MyClass
possibili per scrivere facilitando il mocking.