Com base na resposta de Christian, até onde sei, o termo costura se origina do livro de Feathers, Working Effective with Legacy Code . A definição está na página 31:
Uma costura é um local onde você pode alterar o comportamento do seu programa sem editar nesse local.
Para dar exemplos do que é e do que não é uma costura, considere o seguinte 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();
}
}
As costuras exemplificadas acima seriam costuras, a menos que:
- A aula que está sendo injetada é final.
- O método que está sendo chamado é final.
Basicamente, as costuras facilitam o teste de unidade. Não consigo escrever um teste de unidade MyClass
devido às chamadas para MyStaticClass.staticCall()
e (new MyInstanceClass()).instanceCall()
. Qualquer teste de unidade para MyClass
's doBunchOfStuff()
método teria de teste MyStaticClass.staticCall()
e (new MyInstanceClass()).instanceCall()
e tudo de suas dependências que são chamados. Por outro lado, usando classes não finais com métodos não finais (ou melhor ainda - interfaces), as instâncias injetadas Foo
e BarFactory
tornam MyClass
possíveis testes de unidade para escrever, facilitando a zombaria.