2010-09-07 4 views
7

Wie kann ich den Cast-Vorgang verspotten. Ich habe einen Gussvorgang auf einem abhängigen Objekt, das auf eine andere abhängige Objekt wieWie kann ich den Cast-Betrieb EasyMock?

SqlMapClient sqlMapClient; 
SqlMapClientImpl sqlMapClientImpl = (SqlMapClientImpl) sqlMapClient 

ich spöttisch geworfen werden sowohl die abhängigen clesses dh SqlMapClient und SqlMapClientImpl .Aber ich wissen müssen, wie gegossen zu verspotten EasyMock mit .

Jede Hilfe wäre willkommen.

+1

Die größere Frage ist, warum Sie die Cast-Operation verspotten möchten. Was ist die größere Sache, die du versuchst zu testen? – NamshubWriter

+0

Tolles [XY-Problem] (http://xyproblem.info/). Wenn Sie das Bedürfnis haben, von der Oberfläche in eine konkrete Implementierung zu wechseln, bedeutet dies, dass Ihr derzeitiges Abstraktionslevel undicht ist, und das sollte zuerst geändert werden. – Spotted

Antwort

4

Sie können sich nicht über einen Cast lustig machen, da ein Cast nicht zu einem Methodenaufruf für das Objekt führt.

Verwenden Sie stattdessen EasyMock Klasse Erweiterung der SqlMapClientImpl Klasse zu verspotten, und einen Verweis auf dieses mock der Klasse übergeben, die in einem SqlMapClient zu einem, aber SqlMapClientImpl

Hinweis erfolgt, dass eine niedergeschlagenen wie das zu tun in Ihrem Code ist ein Code-Geruch. Wenn Ihr Produktionscode eine Schnittstelle zu einer Implementierungsklasse herunterfährt, verlieren Sie die gesamte Flexibilität der Verwendung einer Schnittstelle. Es kann tatsächlich schlimmer sein, als überhaupt keine Schnittstelle zu verwenden, da es aussieht, als ob Ihre Klasse von der Schnittstelle abhängt und daher mit jeder Implementierung verwendet werden kann, aber tatsächlich hängt Ihre Klasse von einer spezifischen Implementierung ab.

+0

Dies wird nicht funktionieren, wenn Ihre SqlMapClientImpl eine letzte Klasse ist ..... da Sie eine letzte Klasse nicht ausspionieren können. – JamesD

+0

@JamesD Das OP sagte bereits, dass sie 'SqlMapClientImpl' verspotten. Wenn Sie mit einer finalen Klasse etwas Ähnliches tun müssen, könnten Sie versuchen, ein echtes 'SqlMapClientImpl' zu übergeben, vorausgesetzt, es war billig zu konstruieren. – NamshubWriter

0

Der Grund, warum wir nicht casten können, ist Easy Mock wird dynamisch eine Klasse erstellen, die die SqlMapClient-Klasse implementieren wird und keine Informationen über die Implementierungsklasse (SqlMapClientImpl), so ein billiger Trick könnte eine Klasse erstellen, die implementieren die SqlMapClient-Schnittstelle und erweitern Sie die SqlMapClientImpl-Klasse das könnte funktionieren.