2013-09-25 15 views
8

Nel mio banco di prova, ottengo un valore intero:Junit valere o condizione nel mio caso

int val = getXXX(); 

Poi, vorrei verificare se val o uguale a 3 o uguale a 5 che è ok in entrambi i Astuccio. Così, ho fatto:

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

eseguo il mio test, il registro mostra val è 5, ma il mio codice asserzione sopra non riuscito con AssertionFailedError. Sembra che non possa usare assertTrue(...) in questo modo, quindi, come verificare true per la condizione OR?

+2

Debug il test e controllare il valore di 'val' destra prima che la dichiarazione' assertTrue'. È ancora 5? – chrylis

risposta

7

Ive ha provato a scrivere test rapido:

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

} 

suo passaggio sempre così Credo che ci sia un certo codice inbetween quando il valore viene modificato. È possibile utilizzare

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

per controllare il valore - questa affermazione stamperà bel informazioni che cosa è sbagliato, per esempio:

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

È possibile utilizzare Hamcrest matchers per ottenere un messaggio di errore più chiaro qui:

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

Questo sarà più chiaramente spiegare:

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

mostrando esattamente l'aspettativa e il valore errato che è stato fornito.

+0

Per far funzionare questo si deve includere una dipendenza su hamcrest-library. JUnit dipende solo da hamcrest-core, che non include la classe Matchers. – toongeorges

2

Mentre gli esaminatori Harmcrest possono eseguire il lavoro, queste costanti possono essere facilmente rifatte su una costante più significativa, come un elenco di valori validi. Quindi è possibile utilizzare il metodo contains per verificare che il valore è presente nella lista - IMO è anche più facile da leggere:

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

Dovresti definire una costante per ogni caso di test; Non penso che questo sia ragionevole oltre un paio di casi di test. Queste costanti saranno potenzialmente lontane dal luogo in cui vengono utilizzate. Un altro problema di leggibilità: 'Foo.VALID_VALUES.contains (i)' è meno chiaro rispetto all'approccio con i matcher Harmcrest. Harmcrest fornisce anche un matcher con contiene, che sarebbe anche molto meglio di questo. – garci560