2012-04-19 6 views
32

Ich habe mein bestehendes Framework mit Jfunc erstellt, das eine Möglichkeit bietet, die Ausführung fortzusetzen, auch wenn einer der Asserts im Testfall fehlschlägt. Jfunc verwendet Junit 3.x-Framework. Aber jetzt migrieren wir zu junit4, also kann ich Jfunc nicht mehr verwenden und habe es mit junit 4.10 jar ersetzt.
Jetzt ist das Problem, da wir jfunc in unserem Framework extensiv verwendet haben, und mit junit 4 wollen wir unseren Code die Ausführung fortsetzen, selbst wenn eine der Behauptungen in einem Testfall fehlschlägt.
Hat jemand irgendeinen Vorschlag/Idee dafür, ich weiß in Junit die Tests müssen atomarer sein, d. H. Ein Assert pro Testfall, aber wir können das in unserem Rahmen aus irgendeinem Grund nicht tun.Fortsetzung der Testausführung in Junit4, auch wenn einer der Asserts fehlschlägt

Antwort

41

Sie können dies mit einer ErrorCollector Regel tun.

es zu verwenden, zuerst die Regel als ein Feld in Ihrer Testklasse hinzu:

public class MyTest { 
    @Rule 
    public ErrorCollector collector = new ErrorCollector(); 

    //...tests... 
} 

Dann ersetzen Sie mit Anrufen zu collector.checkThat(...) behaupten.

z.B.

@Test 
public void myTest() { 
    collector.checkThat("a", equalTo("b")); 
    collector.checkThat(1, equalTo(2)); 
} 
+1

Danke für die Antwort chris. Es funktionierte und fuhr nach dem ersten Fehler fort (d. H. Collector.checkThat (10, CoreMatchers.equalTo (11))). Aber das Problem ist, dass ich es den Test als fehlgeschlagen markieren möchte, selbst wenn eine der Prüfungen fehlschlägt. Derzeit wird nach dem Ausführen des obigen Tests der Test als bestanden markiert. Ich möchte, dass es fehlschlägt, und zeigen Sie den StackTrace auf der Fehlerzeile (etwas ähnliches wie wenn eine Asserttion fehlschlägt). – user85

+0

Das ist seltsam. Ich habe gerade den Code ausprobiert, den ich in meiner Antwort geschrieben habe, und es hat wie erwartet funktioniert. Der Test schlägt fehl und es wird die Stapelüberwachung jeder fehlgeschlagenen Assertion ausgedruckt. Hier ist der vollständige Test-Code und die Ausgabe, die ich bekam, den Test von IntelliJ: https://gist.github.com/2419626 –

+0

Oh ... meine schlechte, ich habe nur vergessen, die Regel hinzuzufügen, und es verursacht alle Chaos ..... sorry für die Verwirrung und thx viel für die Post. – user85

8

Ich benutze auch den ErrorCollector, benutze aber assertThat und lege sie in einen try catch-Block.

import static org.junit.Assert.*; 
import static org.hamcrest.Matchers.*; 

@Rule 
public ErrorCollector collector = new ErrorCollector(); 

@Test 
public void calculatedValueShouldEqualExpected() { 
    try { 
     assertThat(calculatedValue(), is(expected)); 
    } catch (Throwable t) { 
     collector.addError(t); 
     // do something 
    } 
} 
0

Verwenden try/finally Blöcke. Das funktionierte in meinem Fall:

... 
try { 
    assert(...) 
} finally { 
    // code to be executed after assert 
} 
... 
+1

Sie wissen, dass diese Frage vor 2 Jahren gepostet wurde und es bereits eine akzeptierte Antwort gibt? –

+4

@TheJuniorProgrammer nur eine allgemeine Anmerkung, diese Seite ist nicht nur über akzeptierte Antworten. Es geht darum, Benutzern, die nach Antworten suchen, zu helfen, eine Lösung für ein Problem zu finden.Manchmal gibt es mehrere Ansätze, um ein Problem zu lösen, und manchmal funktioniert das, was für eine Person funktioniert, möglicherweise nicht so gut für eine andere. – nomistic

+0

@nomistic gut, wahr genug. –