2013-09-25 12 views
8

In meinem Testfall, ich einen ganzzahligen Wert erhalten:Junit assert ODER-Bedingung in meinem Fall

int val = getXXX(); 

Dann würde ich prüfen möchte, ob val entweder gleich 3 ist oder gleich bis 5, die in Ordnung ist entweder Fall. Also, ich tat:

assertTrue(val == 3 || val==5); 

ich meinen Test ausführen, das Protokoll zeigt val 5, aber meine obige Behauptung Code fehlgeschlagen mit AssertionFailedError. Scheint, dass ich assertTrue(...) auf diese Weise nicht verwenden kann, dann, wie man für OR Bedingung prüft?

+2

Debug Ihren Test und prüfen Sie den Wert von 'val' Recht vor dieser' assertTrue' Aussage. Ist es immer noch 5? – chrylis

Antwort

7

IVE versuchte Schnelltest zu schreiben:

@Test 
public void testName() { 
    int i = 5; 
    junit.framework.Assert.assertTrue(i == 3 || i == 5); 

} 

sein Vergehen immer so denke ich dort einig dazwischen Code ist, wenn Ihr Wert geändert wird. Sie können

org.junit.Assert.assertEquals(5, i); 

Wert überprüfen - diese Behauptung wird schön info was falsch ausdrucken, zum Beispiel:

java.lang.AssertionError: 
Expected :4 
Actual :5 
23

können Sie Hamcrest matchers verwenden, um eine klarere Fehlermeldung zu uns kommen:

int i = 2; 
assertThat(i, Matchers.either(Matchers.is(3)).or(Matchers.is(5)) 

or 

int i = 2; 
assertThat(i, Matchers.anyOf(Matchers.is(3),Matchers.is(5))); 

Dies wird noch deutlicher erklären:

Expected: (is <3> or is <5>) 
    but: was <2> 

zeigt genau die Erwartung und den falschen Wert, der bereitgestellt wurde.

+0

Damit dies funktioniert, muss eine Abhängigkeit von hancrest-library enthalten sein. JUnit hängt nur von hamcrest-core ab, das die Matchers-Klasse nicht enthält. – toongeorges

2

Während Harmcrest-Matcher den Job erledigen können, können diese Konstanten leicht zu einer wichtigeren Konstante umstrukturiert werden, wie eine Liste gültiger Werte. Dann können Sie die contains Methode verwenden, um zu überprüfen, dass der Wert in der Liste vorhanden ist - IMO ist auch leichter zu lesen:

public class Foo { 
    public static final List<Integer> VALID_VALUES = Arrays.asList(3, 5); 
} 

@Test 
public void testName() { 
    int i = 5; 
    Assert.assertTrue(Foo.VALID_VALUES.contains(i)); 
} 
+0

Sie müssten für jeden Testfall eine Konstante definieren; Ich denke nicht, dass dies auch nach ein paar Testfällen sinnvoll ist. Diese Konstanten werden möglicherweise weit von dem Ort entfernt sein, an dem sie verwendet werden. Ein weiteres Lesbarkeitsproblem: 'Foo.VALID_VALUES.contains (i)' ist weniger klar als der Ansatz mit Harmcrest matchers. Harmcrest bietet auch einen Matcher mit Contains, der auch viel besser wäre. – garci560