Спираючись на відповідь Крістіана, наскільки мені відомо, термін "шов" походить з книги "Пір'я", що працює ефективно з кодексом спадщини . Визначення знаходиться на сторінці 31:
Шов - це місце, де ви можете змінити поведінку у вашій програмі, не редагуючи в цьому місці.
Щоб навести приклади того, що таке шов, а що ні, розглянемо наступний код 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();
}
}
Приклади, наведені вище, будуть швами, якщо:
- Клас, який вводиться, є остаточним.
- Метод, що викликається, є остаточним.
В основному, шви полегшують тестування одиниць. Я не можу написати одиничний тест дляMyClass
через дзвінки до MyStaticClass.staticCall()
та (new MyInstanceClass()).instanceCall()
. Будь тестовий модуль для MyClass
«S doBunchOfStuff()
метод мав би тест MyStaticClass.staticCall()
і (new MyInstanceClass()).instanceCall()
і все їх залежностей , які викликаються. І навпаки, використовуючи нефінальні класи з нефінальними методами (а ще краще - інтерфейсами), введені екземпляри Foo
та BarFactory
роблять одиничні тести для MyClass
можливості запису, полегшуючи глузування.