Поскольку структура данных моего домена приложений в последнее время становится довольно сложной, я начал читать фиктивные объекты. Вскоре мне пришёл в голову простой вопрос, но ответ оказался головной болью. Итак, вот так:
У нас есть класс 'Foo' с 'bar' в качестве одного из его методов:
class Foo {
public String bar(int i){
if(i == 1) return "arrr!";
}
}
И у нас есть класс Pirate, вызывающий Foo.bar (1); в одном из его методов:
class Pirate {
public String yell(){
Foo foo = new Foo();
return foo.bar(1);
}
Теперь мы высмеиваем класс Foo в модульном тесте класса Pirate, потому что у Foo есть множество других зависимостей:
@Test
public void returnsPirateString() {
Pirate blackBeard = new Pirate();
Foo fooMock = mock(Foo.class);
fooMock.expectAndReturn("bar",1,"arrr!"); //expects 'bar' function to be called once and returns "arrr!"
assertEquals(blackBeard.yell(),"arrr!");
}
Что происходит сейчас, так это то, что если мы рефакторим метод bar, чтобы вернуть null вместо «arrr!», Наш тест будет работать успешно, пока наша программа не будет работать так, как мы этого хотим. Это может привести к возможному кошмару отладки.
Использование подхода mockist вместо классического подхода тестирования к модульному тестированию, в большинстве случаев все «вспомогательные» объекты подвергаются моделированию, и только проверенный объект остается неизменным, поэтому ранее заявленная проблема может возникать довольно часто.
Что можно сделать, чтобы предотвратить эту проблему во время издевательств?