Sobre la base de la respuesta de Christian, que yo sepa, el término costura se origina en el libro de Plumas, Trabajando eficazmente con código heredado . La definición está en la página 31:
Una costura es un lugar donde puede alterar el comportamiento en su programa sin editar en ese lugar.
Para dar ejemplos de qué es una costura y qué no es, considere el siguiente código 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();
}
}
Las costuras ejemplificadas anteriormente serían costuras a menos que:
- La clase que se inyecta es final.
- El método que se llama es final.
Básicamente, las costuras facilitan las pruebas unitarias. No puedo escribir una prueba unitaria MyClass
debido a las llamadas a MyStaticClass.staticCall()
y (new MyInstanceClass()).instanceCall()
. Cualquier prueba de la unidad de MyClass
's doBunchOfStuff()
método tendría que prueba MyStaticClass.staticCall()
y (new MyInstanceClass()).instanceCall()
y todas sus dependencias que consiguen llama. Por el contrario, al usar clases no finales con métodos no finales (o mejor aún, interfaces), las instancias inyectadas Foo
y las BarFactory
pruebas unitarias son MyClass
posibles de escribir al facilitar la burla.