2013-05-02 4 views
26

Capturing zu machen Ich habe mich umgesehen und versuchte verschiedene Dinge vergebens. Die Beispiele da draußen auf den Interwebs sind wenige, und IMHO ziemlich einfach. Mein Anwendungsfall:Gibt es eine Möglichkeit, Mock-Argument in Spock

(der 'itocNetworkHandler' unten ist die mock)

when: "we're doing stuff" 
    StandardResponse response = cms.doCardStuff("123", "111", order) 
.... 
then: "we get proper calls and response object" 
    1 * cms.itocNetworkHandler.doNetworkCall(
      { it instanceof ReplacementRequestRecord 
      }, StandardResponseRecord.class) >> record 

Ich mag würde den Parameter ('it') in den "doNetworkCall" auf dem Schein verstauen.

Der Grund, warum ich den Parameter will, ist, weil das Objekt, das ich teste, meine In-Parameter übernehmen soll, Sachen machen, ein neues Objekt erstellen und dieses zu meinem Mock weitergeben soll. Ich möchte sicherstellen, dass das erstellte Objekt so aussieht, wie es sein soll.

Zeiger sehr geschätzt.

+0

Warum möchten Sie das Argument speichern? Was wirst du damit machen? –

+0

Ich habe oben geklärt, warum ich es brauche. – Mathias

Antwort

35

Sie können ein Argument wie folgt erfassen:

// must be declared before when-block (or inside Specification.interaction {}) 
def captured 

when: 
... 

then: 
1 * mock.doNetworkCall(...) >> { record, recordClass -> 
    // save the argument 
    captured = record 
    ... 
} 
// use the saved argument 
captured == ... 

Das heißt, oft gibt es eine einfachere Lösung ist wie die erwartete Rekord direkt im Argument Constraint-Prüfung (z ...doNetworkCall({ it == ... })).

+0

Danke, funktioniert. Der Grund, warum ich es nicht in "it ==" usw. möchte, ist, dass ich viele Überprüfungen machen möchte, und ich denke, es ist viel aufgeräumter, alles am Ende behauptet zu haben, wenn Sie sehen, was ich meine. – Mathias

+0

Sie könnten die Überprüfungen in eine Hilfsmethode einfügen und die Hilfsmethode von der Argumenteinschränkung aufrufen. –

+1

Ja, das ist eine Möglichkeit. Ich denke, dass ich sie am Ende mag. Es fühlt sich ein bisschen "hinterhältig" an, die Behauptungen innerhalb des Parameterblocks zu machen, um sie am Ende zu lesen. Oder vielleicht bin ich einfach nicht an den Jargon gewöhnt. – Mathias