Die Kombination von @ClassRule und @Regel in JUnit 4.11
In JUnit 4.10 und unten, ist es möglich zu kommentieren in der Regel als beide @ - Regel und @ClassRule. Dies bedeutet, dass die Regel-wird aufgerufen, bevor, bevor/nach der Klasse, und vor/nach jedem test. Ein möglicher Grund dafür ist der Aufbau eines teuren externen Ressource (via @ClassRule Anrufe) und dann Billig-reset (über die @ - Regel fordert).
Als von JUnit 4.11, @Regel-Felder müssen nicht-statische und @ClassRule Felder muss statisch sein, so dass die oben ist nicht mehr möglich.
Gibt es deutlich workarounds (z.B. explizit trennen Sie die @ClassRule und @Regel Aufgaben in separate Regeln), aber es scheint eine Schande zu haben, um das Mandat den Einsatz von zwei Regeln. Habe ich kurz angeschaut, mit der @ - Regel und abzuleiten, ob oder nicht es ist das erste /Letzte test, aber ich glaube nicht, dass die information verfügbar ist (mindestens, es ist nicht direkt in der Beschreibung).
Gibt es eine ordentliche und saubere Art der Kombination der @ClassRule und @Regel-Funktionalität in einer einzigen Regel in JUnit 4.11?
Dank,
Rowan
- Siehe auch JUnit Ausgabe #793 auf GitHub, wo ich fragte die gleiche Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als von JUnit 4.12 (unveröffentlicht zum Zeitpunkt des Schreibens), wird es möglich sein, um kommentieren eine einzelne statische Regel mit beiden
@Rule
und@ClassRule
.Beachten Sie, dass es muss statisch sein - eine nicht-statische Regel versehen mit
@Rule
und@ClassRule
ist immer noch ungültig (wie alles kommentiert@ClassRule
funktioniert auf Klassen-Niveau, also nur wirklich Sinn macht, als ein statisches Element).Sehen die release notes und mein pull-request wenn Sie interessiert sind, mehr detail.
Eine weitere Umgehungsmöglichkeit ist die Deklaration einer statischen @ClassRule und verwenden Sie diesen Wert bei der Deklaration einer nicht-statischen @Regel, zu:
Das bedeutet, dass Sie nicht haben, zu überarbeiten vorhandene Regel-Klassen, aber Sie noch deklarieren müssen zwei Regeln, so spielt es keine Antwort auf die ursprüngliche Frage besonders gut.
Rule
's code, wie du unterscheiden, wenn es feuert als@ClassRule
(einrichten der externen Ressource in Ihrem Beispiel) und wenn es ausgelöst wird, als@Rule
(zurücksetzen der Ressource in diesem Beispiel)?@Rule
, also laufen wir die BasisStatement
und dann reset. Wenn nicht, wir handeln, als@ClassRule
, so setzen wir die Ressource, führen Sie die BasisStatement
und dann schließen Sie die Ressource.Description
ging inTestRule
kann überprüft werden, ob der aktuelle Knoten einen test (d.h. ohne Kinder) oder einer suite (mindestens ein Kind)Noch eine andere mögliche Problemumgehung besteht darin deklarieren Sie eine nicht-statische @Regel, und es wirken auf statischen Mitarbeiter: wenn die Mitarbeiter nicht initialisiert wird noch die @ - Regel kennt, läuft es für die erste Zeit (so Sie es einrichten können, Ihre Mitarbeiter, z.B. starten einer externen Ressource); wenn Sie initialisiert werden, die @ - Regel kann es nicht sein pro-test-arbeiten (z.B. rücksetzen eines externen Ressource).
Dies hat den Nachteil, dass die @ - Regel nicht weiß, Wann es verarbeitet den letzten test, kann so nicht durchführen jegliche nach-Klasse Aktionen (z.B. Aufräumen der externen Ressource); ein @AfterClass Methode kann verwendet werden, um so zu tun, stattdessen aber.
Die Antwort auf deine Frage ist folgende: es gibt keine saubere Möglichkeit, es zu tun (nur setup zwei Regeln gleichzeitig).
Wir implementieren versucht ähnliche Aufgabe für automatische tests, Wiederholungen und zwei Regeln zusammengefasst wurden (für diese Aufgabe) und solche hässlichen Ansatz umgesetzt wurde:
Tests wiederholen, mit zwei Regeln
Aber, wenn Sie denken, genauer an die Aufgabe (das muss umgesetzt werden) der bessere Ansatz kann verwendet werden, die mit jUnit Runner custom:
Wiederholen Läufer.
So, in Reihenfolge zu haben, der bessere Ansatz ist, es wird gut sein, zu wissen, Ihre spezifischen Anwendungsfall.
Ich erlebt habe ähnliche Probleme gibt es zwei Lösungen. Ich weiß nicht, wie entweder ein, aber Sie haben unterschiedliche trade-offs:
1)
Wenn deine Regel aussetzt Verfahren zur Reinigung, können Sie Sie manuell aufrufen, die sauber in einem
@Before
Methode.Die Kehrseite davon ist, müssen Sie daran denken (und zu sagen, andere in Ihrem team) immer hinzufügen, dass der @Before-Methode oder erstellen Sie eine abstrakte Klasse, die Ihre Prüfungen Erben zu tun, das Aufräumen für Sie.
2) Haben 2 Felder, eine statische, nicht-statische, die auf das gleiche Objekt zeigen, wird jedes Feld mit Anmerkungen, indem Sie entweder eine
@ClassRule
oder@Rule
beziehungsweise. Dies ist notwendig, wenn die Bereinigung ist nicht ausgesetzt. Der Nachteil ist natürlich das Sie auch daran denken müssen, haben beide eine @ClassRule und @Regel, zeigen Sie auf die gleiche Sache, die seltsam aussieht.Dann in Ihrer Implementierung müssen Sie unterscheiden zwischen test-suite oder in einem einzigen test. Dies kann erfolgen, indem überprüft wird, ob die
Description
hat keine Kinder. Je nachdem, welche Sie erstellen verschiedeneStatement
Adapter zu behandeln Aufräumen oder nicht:Hier ist der Brauch
Statement
Klasse zu bereinigen, vor jedem test:Nachdem alle, dass, ich würde lehnen Sie sich mehr in Richtung option 1, weil es mehr ist Absicht enthüllt und ist weniger code zu pflegen. Ich würde mich auch über andere sorgen, die versuchen, ändern Sie den code in option 2 denke es war ein Fehler, da der gleiche Feld zeigte zweimal. Der zusätzliche Aufwand, code, Kommentare etc sind es nicht Wert.
Eitherway Sie haben noch Textbaustein kopieren und einfügen überall oder abstrakte Klassen unter Verwendung einer template-Methode.