Основываясь на ответе Кристиана, насколько мне известно, термин «шов» происходит из книги Пера «Эффективная работа с устаревшим кодексом» . Определение на странице 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
возможности написания, облегчая имитацию.