Ist es ein Code-Geruch, um ein Objekt auszuspionieren, das getestet wird? Angenommen, ich habe eine Klasse LineCounter
, deren Aufgabe es ist, einfach die Anzahl der Zeilen in einer Zeichenfolge zu zählen. -
Nun möchte ich einen JUnit 4-Test schreiben, um die getNumLines
-Methode zu testen und dabei den teuren getStringMetadata
-Aufruf zu verspotten. Ich entscheide mich dafür, Mockitos Spionage-Mechanismus zu verwenden, damit getStringMetadata
einen Dummy-Wert zurückgibt.
Ist das vernünftig? Ich fühle mich ziemlich komisch beim Testen eines Spy-Objekts anstatt der eigentlichen Klasse, aber ich kann mir wirklich keinen Grund dafür vorstellen.
Ich werde die Frage in zwei Teilen beantworten. Erstens, es ist Code-Geruch, um die getestete Klasse zu verspotten oder auszuspionieren. Das bedeutet nicht, dass es nicht richtig gemacht werden kann, sondern dass es risikoanfällig ist und möglichst vermieden werden sollte.
WRT Ihr spezifisches Beispiel, ich würde sehen, wie der Spion korrekt verwendet werden konnte, aber das würde auf der Behauptung basieren, dass Sie woanders vollständig Unit-getestet getStringMetadata
haben. Das wirft dann die Frage auf, ob Sie getStringMetadata
anderswo Unit-getestet haben, dann müssen Sie wissen, wie man es testet und deshalb getNumLines
nicht ohne den Spy testen.
All dies wird gesagt, millhouse
macht einen guten Punkt, aber so oder so müssen Sie den teuren Code irgendwo testen. Sein Vorschlag hilft Ihnen, den teuren Code zu isolieren und sicherzustellen, dass Sie ihn nur einmal ausprobieren müssen.
In dieser Situation ist es vollkommen legitim, die Methode, die von der zu testenden Methode aufgerufen wird, zu stubben. Es ist sogar die einzige Möglichkeit, um es isoliert zu testen. Sie wollen einfach keine einzige Methode in ihre eigene Klasse extrahieren, um sie zu testen.
Vorsicht vor den Nebenwirkungen in der Stubbed-Methode. Es reicht möglicherweise nicht aus, den zurückgegebenen Wert zu stubben, wenn die Stub-Methode Nebenwirkungen hat, dann müssen Sie auch die Nebenwirkungen löschen. In einigen Situationen, in denen die Nebenwirkungen sehr komplex sind, könnte es sogar ein Grund dafür sein, aber das wäre höchstwahrscheinlich ein Anzeichen für einen Code-Geruch bei der Implementierung der getesteten Klasse.
Um Ihre Frage zu beantworten, finde ich es einfach Gründe zu finden für es, aber es ist schwierig Gründe gegen zu finden. Es ist die Technik, die ich jeden Tag benutze. Sie hilft mir dabei, meine Implementierung in kleine Methoden zu zerlegen, die individuell in vollständiger Isolation getestet werden, und ich habe bis jetzt keine Einschränkung gesehen.
Tags und Links java unit-testing junit mockito