Vor einiger Zeit las ich auf einer Stapelüberlauf-Antwort, die ich nicht finden kann, einen Satz, der erklärte, dass Sie öffentliche APIs testen sollten, und der Autor sagte, dass Sie Schnittstellen testen sollten. Der Autor erklärte auch, dass bei einer Änderung der Methodenimplementierung der Testfall nicht geändert werden muss, da dies den Vertrag unterbrechen würde, der sicherstellt, dass das zu testende System funktioniert. Mit anderen Worten, ein Test sollte fehlschlagen, wenn die Methode nicht funktioniert, aber nicht, weil sich die Implementierung geändert hat.
Dies machte mich aufmerksam, wenn wir über das Verspotten sprechen. Da die Verspottung stark von den Erwartungsaufrufen der Abhängigkeiten des zu testenden Systems abhängt, sind die Verspottungen eng mit der Implementierung und nicht mit der Schnittstelle verbunden.
Bei der Untersuchung von Mock vs Stub stimmen mehrere Artikel darin überein, dass Stubs anstelle von Mocks verwendet werden sollten, da sie sich nicht auf die Erwartungen aus Abhängigkeiten stützen. Dies bedeutet, dass für den Test keine Kenntnisse des zugrunde liegenden Systems erforderlich sind, das der Testimplementierung zugrunde liegt.
Meine Fragen wären:
- Verstoßen Mocks gegen das Open / Closed-Prinzip?
- Fehlt etwas in dem Argument zugunsten von Stubs im letzten Absatz, das Stubs im Vergleich zu Mocks nicht so großartig macht?
- Wenn ja, wann wäre es sinnvoll, Stubs zu verspotten, und wann wäre es sinnvoll, Stubs zu verwenden?
Since mocking relays heavily on expectation calls from system under test's dependencies...
Ich denke, das ist, wo Sie schief gehen. Ein Mock ist eine künstliche Darstellung eines externen Systems. Es stellt das externe System in keiner Weise dar, es sei denn, es simuliert das externe System so, dass Tests mit Code ausgeführt werden können, der Abhängigkeiten von diesem externen System aufweist. Sie benötigen noch Integrationstests, um zu beweisen, dass Ihr Code mit dem realen, nicht gespielten System funktioniert.