2010-09-27 3 views
8

Warum ist so viel Hass über "teilweise Spott" und den Code, der es erfordert?Partial Mocking als Code riechen?

Hier ist ein (theoretisches) Beispiel-Implementierung:

public ComplexResult1 operationA(Stimulus a) { 
    { 
     ... 
     result = ...; 
    } 
    auditTheChange(a); 
} 
public ComplexResult2 operationB(Stimulus b) { 
    { 
     ... 
     result = ...; 
    } 
    auditTheChange(b); 
    return result; 
} 
void auditTheChange(Stimulus stim) { 
    // do a bunch of stuff to record the change 
    // and interact with another outside service 
} 

Nun, in meinem Verständnis dieses gut Überarbeitete Code.

Wenn ich Unit-Test operationA will und operationB, und sicherzustellen, dass die Überwachung in jedem Szenario geschieht, aber ohne die Besonderheiten des Prüfungs Code zu testen ist, würde ich teilweise spöttisch verwenden.

Was sehe ich nicht, was dazu führt, dass so viele Projekte (EasyMock, Mockito usw.) Refactoring empfehlen?

+0

Wer ist derjenige, der pauschale Aussagen gegen die Verwendung von partiellen Mocks macht? –

+0

Das ist eine ziemlich ungerechtfertigte Verwendung des Wortes "hassen" – skaffman

+0

@kirk, von EasyMock Dokumentation: "In diesem Fall ist die erste Sache zu tun, ein Refactoring zu betrachten, da die meiste Zeit dieses Problem durch ein schlechtes Design verursacht wird nicht der Fall, oder wenn Sie wegen einiger Entwicklungseinschränkungen nicht anders können, hier ist die Lösung. " – Nelz

Antwort

4

Wenn Auditing wirklich eine interne Funktion der Klasse ist, sollte der Code als Teil des Komponententests getestet werden. Warum behandelt Ihre Klasse sowohl komplexe Vorgänge als auch Auditing? Könnte das Auditing in eine separate Klasse verschoben werden?

Wenn dies der Fall ist, führen Sie das Auditing als Kollaborateur mit dieser Klasse ein und mock-out. Wenn nicht, testen Sie es.

Sie können teilweise Mocks verwenden, aber in diesem Fall denke ich, es ist ein Hinweis darauf, dass die Klasse zu viel tut.

+0

Ein gültiger Anwendungsfall könnte sein, wenn alle öffentlichen Methoden eine Art von cleanUp() am Ende von ihnen aufrufen. In diesem Fall können Sie selbst einen Unit Test für cleanUp() schreiben. Wenn Sie dann alle öffentlichen Methoden testen, verwenden Sie einen partiellen Mock, um einfach zu überprüfen, dass cleanUp() aufgerufen wurde, und vermeiden Sie die Überprüfung der Details dessen, was cleanUp() in jeder öffentlichen Methode getan hat. –