Ist es richtig, dass Rhino Mocks Stubs und Mocks nur für Interfaces geeignet sind, nicht für konkrete Klassen? Ich habe ziemlich viel Zeit damit verbracht, dieses Code-Stück zum Laufen zu bringen. Ich habe nicht erwartet, dass der stubbed pubSubClient die Send-Methode immer von der Klasse aufruft. Diese Methode hat einige Abhängigkeiten und löst eine Ausnahme aus.Rhino Mocks Stubs und Mocks sind nur gut für Schnittstellen?
[Test]
public void Test01()
{
PubSubMessage psm = new PubSubMessage();
var pubSubClient = MockRepository.GenerateStub<PubSubClient>();
pubSubClient.Stub(x => x.Send(psm)).IgnoreArguments().Return(null);
// actual PubSubClient Send method throws exception
// the rest of the test is skipped...
}
Allerdings, wenn ich die Schnittstelle extrahiert haben und den gleichen Test mit IPubSubClient laufen, so scheint es wie erwartet zu arbeiten.
Bedeutet es, dass ich die Schnittstelle für jede Klasse extrahieren muss, die ich mit Rhino spotten will? Oder ich vermisse etwas, technisch oder konzeptionell?
UPDATE: OK, es scheint, dass ich herausgefunden, was Teil I fehlte: Rhino Mocks können nicht abfangen Anrufe an nicht-virtuellen Methoden. Also, ich denke ich benutze entweder Schnittstellen oder mache jede Methode auf der konkreten Klasse virtuell. Bitte korrigieren Sie mich, wenn es eine andere Option gibt.
Wenn Sie angeben, dass partielle Mocks nicht für etwas sind, ist es hilfreicher zu sagen, wofür sie in Ihrer Antwort sind. Partielle Mocks sollen nur einen Teil einer Klasse vortäuschen, das macht sie nützlich (und erforderlich), um eine abstrakte Klasse zu verspotten, in der ein normaler Spott nicht damit umgehen kann. Dies ermöglicht das Testen von abstrakten Methoden. Ein partieller Mock (zumindest in Rhino) verspottet jede Klasse und ist nicht auf abstrakte Klassen beschränkt. Beachten Sie jedoch, ob es einen Implementierungscode gibt, der bei der Rückgabe aufgerufen wird. –
(Nekro-Alarm): Ich habe gerade herausgefunden, dass deine Klasse nicht einmal abstrakt sein muss, um Methoden virtuell zu machen! So eine kleine Sache, aber ich habe es nie zuvor in Betracht gezogen :-) – Heliac