2013-09-25 17 views
8

W moim przypadku testu, otrzymuję wartość całkowitą:Junit assert lub stan w moim przypadku

int val = getXXX(); 

Następnie chciałbym sprawdzić czy val albo równy 3 lub równa 5, który jest ok, albo w walizka. Więc zrobiłem:

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

uruchomić mój testu log pokazuje val wynosi 5, ale mój powyższy kod twierdzenie nie powiodło się z AssertionFailedError. Wydaje się, że nie mogę w ten sposób użyć assertTrue(...), a następnie, jak sprawdzić, czy warunek OR jest prawdziwy?

+2

debug test i sprawdzić wartość 'val' tuż przed tym' oświadczenie assertTrue'. Czy to wciąż 5? – chrylis

Odpowiedz

7

ive próbował napisać szybki test:

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

} 

jego odejście zawsze tak chyba jest jakiś kod pomiędzy nimi, gdy wartość ulega zmianie. Można użyć

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

sprawdzić wartość - to twierdzenie będzie wydrukować piękny informacje Co złego, na przykład:

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

Można użyć Hamcrest matchers aby uzyskać jaśniejszy komunikat o błędzie tutaj:

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))); 

Wyjaśniej to wyjaśni:

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

pokazuje dokładnie oczekiwane i podane nieprawidłowe wartości.

+0

Aby to działało, należy uwzględnić zależność od biblioteki hamcrest. JUnit zależy tylko od hamcrest-core, który nie zawiera klasy Matchers. – toongeorges

2

Podczas dopasowywania Harmcrest można wykonać zadanie, te stałe można łatwo refaktoryzacji do bardziej znaczącej stałej, takich jak lista prawidłowych wartości. Następnie można użyć metody contains aby sprawdzić, czy wartość jest obecny na liście - IMO jest również łatwiejsze do odczytania:

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

Musisz zdefiniować stałą dla każdego przypadku testowego; Nie sądzę, że jest to uzasadnione poza kilkoma testowymi przypadkami. Te stałe będą potencjalnie odległe od miejsca, w którym są używane. Inny problem z czytelnością: 'Foo.VALID_VALUES.contains (i)' jest mniej czytelny niż podejście z dopasowującymi Harmcrest. Harmcrest zapewnia również matcher z zawartością, co również byłoby znacznie lepsze. – garci560