Представьте на мгновение, что m1
не зависит от m2
.
Теперь учтите, что m1
не вызывал m2
, а дублировал код m2
внутри себя.
(В любом из приведенных выше сценариев вы бы протестировали и m1
, и m2
, верно?)
Теперь представьте, что произойдет, если вы рефакторите m1
, чтобы удалить повторяющийся код, заставив его вызывать m2
. Поскольку это настоящий рефакторинг (т. е. он не меняет поведение метода), ваши существующие тесты должны продолжать проходить.
Я хочу сказать, что зависимость m1
от m2
является частной деталью реализации. Обычно вы хотите скрыть детали реализации от своих тестов, чтобы они не стали хрупкими. Следовательно, вы должны писать свои тесты так, как если бы они не знали об этой зависимости.
Изменить: добавлен код для демонстрации.
Представьте, что мы написали следующий код и тесты (извините за любые синтаксические ошибки, у меня нет под рукой компилятора):
interface Foo {
public void doStuff(int value);
}
interface Bar {
public void doOtherStuff();
}
class MyClass {
private Foo foo;
private Bar bar;
public MyClass(Foo foo, Bar bar) {
this.foo = foo;
this.bar = bar;
}
public void m1() {
foo.doStuff(42);
foo.doOtherStuff();
}
public void m2() {
foo.doStuff(42);
}
}
@Test
public void m1ShouldDoALotOfStuff() throws Exception {
Foo foo = PowerMockito.mock(Foo.class);
Bar bar = PowerMockito.mock(Bar.class);
MyClass sut = new MyClass(foo, bar);
sut.m1();
verify(foo).doStuff(42);
verify(bar).doOtherStuff();
}
@Test
public void m2ShouldJustDoStuff() throws Exception {
Foo foo = PowerMockito.mock(Foo.class);
Bar bar = PowerMockito.mock(Bar.class);
MyClass sut = new MyClass(foo, bar);
sut.m2();
verify(foo).doStuff(42);
}
В приведенном выше коде у нас есть зеленые тесты для m1
и m2
. Теперь мы замечаем, что в m1
и m2
есть дублирующийся код: foo.doStuff(42);
. Итак, мы рефакторим m1
, чтобы избавиться от дублирования:
public void m1() {
m2();
foo.doOtherStuff();
}
Наши тесты все еще зеленые после внесения этого изменения, потому что мы не изменили поведение m1
; мы только изменили детали того, как он выполняет это поведение. Чтобы быть надежными, наши тесты должны проверять, что мы ожидаем от ТУС, не проверяя, как он это делает.
person
Lilshieste
schedule
14.05.2014