Узнал о таком забавном антипаттерне и интересном его описании. Все на поверхности, но на практике такие тесты таки всплывают. Вот код
int add(int a, int b){
return a+b;
}
Представим такой дебильный тест на несуществующем фреймворке
assertEquals(add_code,
"int add(int a, int b){"+
" return a+b;"+
"}");
Несмотря на отличный test coverage, покрытие всех возможных сценариев, подробное описание поведения функции, этот тест идиотский более чем полностью и ничего полезного не тестирует. Более того, если поменять код add даже безобидно, добавив логгирование, то тест упадет и его нужно будет править. Он по сути упадет при любом изменении гарантировано.
Так вот, к чему я веду. Мы все часто пользуемся mocks. Вот более реалистичный код.
void myFunction(MyObject obj, MyOtherObject obj2){
int x = obj.doSomething();
obj2.doSomethingElse(x);
}
И тест
MyObject o = mock(MyObject.class);
MyOtherObject o2 = mock(MyOtherObject.class);
validate(o.doSomething()).return(2);
validate(o2.doSomethingElse(2));
myFunction(o, o2);
А если посмотреть правде в глаза - ни верхний дебильный тест и этот по сути ничем не отличаются.
Такие дела. Мораль истории - не пишите такие тесты если не уверены на точно что в данном случае так и надо. Нужно пытаться проверять только точно желаемые вызовы и избегать влезания в реализацию в тесте
Всем спасибо, я все сказал.