Mocking Frameworks sollen es einfacher machen, Abhängigkeiten der Klasse, die Sie testen, auszuspotten. Wenn Sie ein Verspottungsframework zum Verspotten einer Klasse verwenden, erstellen die meisten Frameworks dynamisch eine Unterklasse und ersetzen die Methodenimplementierung durch Code, um zu erkennen, wann eine Methode aufgerufen wird, und einen falschen Wert zurückzugeben.
Wenn Sie eine abstrakte Klasse testen, möchten Sie die nicht abstrakten Methoden des zu testenden Subjekts (Subject Under Test, SUT) ausführen, sodass ein Verspottungsframework nicht das ist, was Sie möchten.
Ein Teil der Verwirrung besteht darin, dass die Antwort auf die Frage, mit der Sie verlinkt haben, darin besteht, einen Schein zu erstellen, der sich von Ihrer abstrakten Klasse erstreckt. Ich würde eine solche Klasse nicht als Mock bezeichnen. Ein Mock ist eine Klasse, die als Ersatz für eine Abhängigkeit verwendet wird, mit Erwartungen programmiert ist und abgefragt werden kann, um festzustellen, ob diese Erwartungen erfüllt sind.
Stattdessen schlage ich vor, in Ihrem Test eine nicht abstrakte Unterklasse Ihrer abstrakten Klasse zu definieren. Wenn dies zu viel Code ergibt, kann dies ein Zeichen dafür sein, dass Ihre Klasse schwer zu erweitern ist.
Eine alternative Lösung wäre, Ihren Testfall selbst abstrakt zu machen, mit einer abstrakten Methode zum Erstellen des SUT (mit anderen Worten, der Testfall würde das Entwurfsmuster der Vorlagenmethode verwenden ).
SomeAbstract spy = spy(SomeAbstract.class);