2013-09-25 2 views
8

В моем тестовом случае, я получаю целое значение:Junit утверждает или условие в моем случае

int val = getXXX(); 

Тогда, я хотел бы проверить, если val либо равен 3 или равен 5, который хорошо в любом дело. Итак, я сделал:

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

Я бег моего теста, журнал показывает val 5, но мои выше коды утверждения потерпели неудачу с AssertionFailedError. Кажется, я не могу использовать assertTrue(...) таким образом, то как проверить true для условия ИЛИ?

+2

отлаживать тест и проверьте значение 'val' прямо перед этим' оператором assertTrue'. Это еще 5? – chrylis

ответ

7

ив пытался писать быстрый тест:

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

} 

его прохождение всегда так я предполагаю, что есть некоторый код, когда между ними изменяются ваше значение. Вы можете использовать

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

проверить значение - это утверждение будет распечатать хорошую информацию, что случилось, например:

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

Вы можете использовать Hamcrest matchers, чтобы получить более четкое сообщение об ошибке здесь:

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

Это будет более понятно:

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

, показывающий точно ожидаемое и неверное значение, которое было предоставлено.

+0

Для этого нужно включить зависимость от библиотеки hamcrest. JUnit зависит только от hamcrest-core, который не включает класс Matchers. – toongeorges

2

В то время как помощники Harmcrest могут выполнять эту работу, эти константы могут быть легко реконфигурированы на более простую константу, например, список действительных значений. После этого вы можете использовать метод contains, чтобы проверить, что значение присутствует в списке - IMO также легче читать:

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

Вам нужно будет определить константу для каждого тестового примера; Я не думаю, что это разумно за пределами нескольких тестовых случаев. Эти константы потенциально будут далеки от того места, где они используются. Другая проблема читаемости: 'Foo.VALID_VALUES.contains (i)' менее понятна, чем подход с совпадениями Harmcrest. Harmcrest также предоставляет сокет содержит, который также будет намного лучше, чем это. – garci560

Смежные вопросы