Wenn Spock ' s @Shared annotation sollte bevorzugt über ein statisches Feld?
Gibt es nicht viel hinzuzufügen, die ganze Frage ist im Titel.
Betrachten Sie diese zwei Instanzen der Klasse Foo verwendet ein Spock-Spezifikation.
@Shared Foo foo1 = new Foo()
static Foo foo2 = new Foo()
Insgesamt, ich weiß, die Idee hinter @Shared
Anmerkung, aber ich denke, es ist besser, die Sprache zu verwenden, die features, welche in diesem Fall wäre static
Feld.
Gibt es bestimmte Fälle, in denen die eine der anderen vorgezogen oder ist es eher eine Frage des Geschmacks?
- Afaik sind Sie genauso effektiv funktionell, aber
@Shared
besser zeigt Sie Ihre Absicht
Du musst angemeldet sein, um einen Kommentar abzugeben.
Spock ist alles über Ausdruckskraft und Klarheit.
Statische ist ein Java-Schlüsselwort, das zeigt nur die Interna der Klasse (in diesem Feld ist die gleiche für alle Instanzen)
@Freigegebenen ist ein Spock-feature, das sagt dem Leser, dass diese variable ist für alle die gleiche Funktion Methoden. Es ist eine Anweisung, die speziell für das Gerät testen und lässt den unit-test mehr klar für den Leser.
Das gleiche kann gesagt werden für die Haupt-Spock-Blöcke. Wenn Sie denken es Sie nicht wirklich etwas ändern am code.
Sowohl unit-tests genau das tun die gleiche Sache technisch. Den zweiten aber zeigt sich deutlich die Absicht. Die , wenn: und dann: Beschriftungen nicht wirklich etwas tun mit dem anderer code als der Klärung seiner Absichten.
Also zu summieren, @Freigegebenen macht der test mehr lesbar. (Siehe auch @Ausgabe, @Title etc., Sie existieren für den gleichen Zweck)
Im Gegensatz zu JUnit, wo Sie haben, um zu erklären Feld variable statische und Wert zuweisen, um es in
damit es initialisiert wurde, nur einmal pro test-suite (nicht jede Methode), in der Spock können Sie mit Instanz-Feld, variable und kommentieren es mit
@Shared
.Betrachten Sie das folgende Beispiel:
Läuft SubclassSpec gibt Ihnen die folgende Ausgabe:
Kann nicht erklären, der Druckauftrag zwar an, aber das ist aufgrund AST.
@Shared
macht Spezifikation besser lesbar und ermöglicht es nutzt eine Instanz-basierten Methoden (wie überschreiben).Als vollständiger Ansatz, hier ein Beispiel-test-mit-Ausgänge:
Das überraschende für mich ist, dass sowohl die variable in der Klasse
setup()
- Methode ALS AUCH der globalen, instanzierte variable wieder auf jede Prüfung (vermutlich, weil die Klasse neu instanziert für jeden Testfall). Mittlerweile, diestatic
und die@Shared
Variablen wie erwartet arbeiten. Als Ergebnis, die zwei letzteren sind auch in der Lage, auf die zugegriffen werden, die inwhere
Klauseln, die ausgeführt werden, bevor einige der anderen, die, die aufgeführt sind, vor der in jedem Fall testen.@Test
Fall, kein Wunder, das gleiche gilt für JUnit. Können Sie erläutern, wie der Letzte Satz? Ich verstehe es nicht.