Masz klasę X i piszesz testy jednostkowe, które weryfikują zachowanie X1. Istnieje również klasa A, która bierze X jako zależność.
Pisząc testy jednostkowe dla A, kpisz z X. Innymi słowy, podczas testowania jednostkowego A ustawiasz (postulujesz) zachowanie próbnego X na X1. Czas płynie, ludzie używają twojego systemu, potrzebuje zmian, X ewoluuje: modyfikujesz X, aby pokazać zachowanie X2. Oczywiście testy jednostkowe dla X nie powiodą się i będziesz musiał je dostosować.
Ale co z A? Testy jednostkowe dla A nie zakończą się niepowodzeniem, gdy zachowanie X zostanie zmodyfikowane (z powodu drwiny z X). Jak wykryć, że wynik A będzie różny, gdy zostanie uruchomiony z „prawdziwym” (zmodyfikowanym) X?
Oczekuję odpowiedzi w stylu: „To nie jest cel testowania jednostkowego”, ale jaką wartość ma testowanie jednostkowe? Czy to naprawdę mówi ci tylko, że kiedy wszystkie testy zakończą się pomyślnie, nie wprowadziłeś przełomowej zmiany? A gdy zachowanie niektórych klas zmienia się (dobrowolnie lub niechętnie), jak możesz (najlepiej w sposób zautomatyzowany) wykryć wszystkie konsekwencje? Czy nie powinniśmy koncentrować się bardziej na testach integracyjnych?
X1
mówisz, że X
implementuje interfejs X1
. Jeśli zmienić interfejs X1
do X2
makiety użytego w innych badaniach nie powinna już kompilacji, stąd jesteś zmuszony rozwiązać te testy też. Zmiany w zachowaniu klasy nie powinny mieć znaczenia. W rzeczywistości twoja klasa A
nie powinna zależeć od szczegółów implementacji (co w takim przypadku miałbyś zmienić). Testy jednostkowe A
są więc nadal poprawne i mówią, że A
działa, biorąc pod uwagę idealną implementację interfejsu.