2009-07-17 13 views
3

Ich glaube, Sie mit diesem Idiom vertraut sein, die für Verschlüsse Art von Java Entschuldigung istWie testen anonyme Klassen?

//In the "Resource Manager" class 
public void process(Command cmd){ 
    //Initialize 
    ExpensiveResource resource = new ExpensiveResource(); 
    //Use 
    cmd.execute(resource); 
    //Release/Close 
    resource.close(); 
} 

//In the Client class... 
manager.process(new Command(){ 

    public void execute(ExpensiveResource res){ 
    //Do things with the resource 
    } 
}); 

ich dieses Idiom/Muster viel verwendet, aber recently I tried to test it, und es ist mir Kopfschmerzen geben ...

Wie können Sie den ResourceManager und die Client-Klassen isoliert testen? Ich habe festgestellt, dass diese Paare sie so eng miteinander verbinden, dass du es nicht leicht machen kannst.

Ideen werden geschätzt.

Grüße

Antwort

1

Wenn Sie den anonymen Typ nicht zu einem echten Typ machen möchten, den Sie testen können, sollten Sie den Code in seiner Funktion execute() in eine andere Funktion verschieben, die Sie testen können. Der anonyme Typ wird dann zu einem bescheidenen Objekt (http://xunitpatterns.com/Humble%20Object.html).

bearbeiten aber Sie sollten weiterhin einen Weg finden, um den Code in der anonymen Funktion zu testen.

In einer typsicheren Sprache wie C# kann dies geschehen, indem der anonyme Code eine virtuelle Memberfunktion aufruft. Der Test spezialisiert sich auf die Klasse, indem er den virtuellen Funktionsaufruf überschreibt und überprüft, ob er aufgerufen wird.

In einer nicht typsicheren Sprache wie Javascript ist die aufgerufene Mitgliedsfunktion bereits virtuell. Anstatt einen abgeleiteten Typ zu erstellen, können Sie die aufgerufene Elementfunktion mit einer aufgezeichneten Version überschreiben.

0

Sie anonyme innere Klassen nicht viel verwenden (wenn überhaupt). Abgesehen davon, dass sie schwierig zu testen sind, sind sie praktisch unmöglich ohne Kopieren und Einfügen wiederzuverwenden.

Die meiste Zeit, macht sie zu vollen Klassen ermöglicht mehr Flexibilität und verbessert Ihre OO-Design (Hinzufügen von mehr Klassen fast immer verbessert Ihr Design).

Übrigens, wie Sie erwähnt haben Verschlüsse auch das gleiche Problem - schwer wieder zu verwenden.

+3

Wenn Verschlüsse zu weniger Codewiederverwendung (statt mehr) in Ihrem Code führen, verwenden Sie sie nur falsch; Aber an ihnen ist nichts falsch. In der Tat führt ein Framework, das sich um Closures dreht, in der Regel zu einem dramatischen Anstieg der Codewiederverwendung (weil Sie dieselben Algorithmen mit unterschiedlichen Prädikaten usw. wiederverwenden können). Dito für anonyme Klassen. –

+0

Ich bin mit Pavel ... Ich vermisse wirklich Verschlüsse während der Arbeit in Java –

+1

Bitte erklären Sie, wie das Element, das Sie als eine Schließung übergeben, wiederverwendet werden kann. Ich kann geraden OO-Code schreiben, um so viel Wiederverwendung wie eine Schließung zu bekommen, aber ich kann nicht herausfinden, wie ich das Snippit, das ich übergebe, wiederverwende, aber vielleicht sind Schließungen besser als anonyme innere Klassen - ich benutze sie regelmäßig und kann Ihnen sagen, dass es praktisch keine Möglichkeit gibt, den Code, den Sie anonym weitergeben, wiederzuverwenden. –

5

Ich denke, dass anonyme Klassen so klein und einfach sein sollten, dass das Testen der Struktur, die sie enthält/verwendet, gut genug sein sollte.

Wenn Sie etwas so kompliziert haben, groß, wichtig, dass Sie das Gefühl haben, es zu testen, machen Sie es zu einer vollen Klasse.

Verwandte Themen