Jakiś czas temu przeczytałem na odpowiedzi Przepełnienie stosu, której nie mogę znaleźć, zdanie wyjaśniające, że powinieneś przetestować publiczne interfejsy API, a autor powiedział, że powinieneś przetestować interfejsy. Autor wyjaśnił również, że jeśli zmieni się implementacja metody, nie trzeba modyfikować przypadku testowego, ponieważ spowoduje to zerwanie umowy zapewniającej działanie testowanego systemu. Innymi słowy, test powinien zakończyć się niepowodzeniem, jeśli metoda nie działa, ale nie dlatego, że implementacja uległa zmianie.
Zwróciło to moją uwagę, gdy mówimy o kpinach. Ponieważ wyśmiewanie polega w dużej mierze na wywołaniach oczekujących z testowanych zależności systemu, symulacje są ściśle powiązane z implementacją, a nie z interfejsem.
Podczas badań próbnych i próbnych , kilka artykułów zgadza się, że zamiast próbnych powinny być stosowane kody pośredniczące, ponieważ nie opierają się one na oczekiwaniach wynikających z zależności, co oznacza, że test nie wymaga znajomości bazowego systemu w trakcie testowania.
Moje pytania brzmiałyby:
- Czy kpiny naruszają zasadę otwartego / zamkniętego?
- Czy w ostatnim argumencie brakuje czegoś na korzyść kodów pośredniczących, które sprawiają, że kody pośredniczące nie są tak świetne w porównaniu do próbnych?
- Jeśli tak, to kiedy byłby to dobry przypadek użycia do wyszydzenia, a kiedy byłby dobry przypadek użycia do użycia kodów pośredniczących?
Since mocking relays heavily on expectation calls from system under test's dependencies...
Myślę, że właśnie tam się nie udajesz. Kpina to sztuczna reprezentacja systemu zewnętrznego. Nie reprezentuje w żaden sposób systemu zewnętrznego, z wyjątkiem przypadków, gdy symuluje system zewnętrzny w taki sposób, że pozwala na uruchomienie testów z kodem zależnym od tego systemu zewnętrznego. Nadal będziesz potrzebować testów integracyjnych, aby udowodnić, że Twój kod działa z prawdziwym, niezamkniętym systemem.