2016-08-02 2 views
0

Я создал следующий метод, который я использую для проверки преобразования чисел с римскими цифрами. В JUnit проходит тест, но программа не вызывает никаких исключений. Где я ошибся?Как протестировать исключение в Java Junit

public void validateState(String number){ 
    if(!number.matches("^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$")) 
     throw new IllegalArgumentException("Invalid number"); 

    System.out.println("Invalid number"); 
} 

Тест:

@Test(expected = IllegalArgumentException.class) 
public void test15() throws Exception { 
    new RomanNumber("").validateState("MMMMM"); 
} 

Спасибо за помощь.

+0

использовать отладчик, чтобы найти его – Jens

+0

Это, вероятно, в ваш REGEX, проверите регулярное выражение для действительности – Adelin

+0

Небольшое предложение, переменное имя «число», которое является строкой, может привести к потенциальной путанице. –

ответ

4

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

@Test(expected = IllegalArgumentException.class) 

Удалить @Test(expected = IllegalArgumentException.class), и вы увидите, что тест не пройден.


Редактировать, чтобы ответить на ваш комментарий: почему я не вижу «Invalid число» сообщение

Вы видите исключение с StackTrace в выходной (терминал), если исключение не пойманный любым объектом-абонентом. Но, как я только что объяснил в своем комментарии, в вашем случае вы не видите исключение, потому что оно захвачено JUnit (которое является объектом-вызывателем), поскольку вы использовали ожидаемый атрибут в аннотации @Test. Когда вы запускаете свой метод, бегун JUnit перехватывает ваш бросок IllegalArgumentException, потому что бегун JUnit знает, что он должен проверить, что был выброшен IllegalArgumentException.
Виртуальная машина Java записывает исключение в выводе (поток ошибок в этом случае) только если исключение восходит до верхней части стеки вызовов (это означает, что ни один в исполняемом коде не поймал исключение)

+0

Нормально ли, что я не вижу сообщение «Недопустимый номер»? – InExperience

+1

@ user1526278 Как вы могли видеть что-то, написанное после утверждения, которое выдает исключение и завершает выполнение? Sysout, который у вас там, должен быть скорее «действительным числом» –

+0

@ user1526278 Это зависит от того, как вы запускаете тесты. Если вы используете eclipse, вы увидите «недопустимый номер», щелкнув зеленый индикатор прогресса рядом с тестом на вкладке junit. Конечно, отображаемый текст был бы сообщением исключения и трассировкой стека, а не System.out.println после того, как будет выбрано исключение. – BackSlash

0

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

expected = IllegalArgumentException.class 

Удалите эту строку из вашего @Test аннотации и он начнет бросать исключение.

+0

Если я удаляю @Test (ожидается = IllegalArgumentException.class), то тест выполняется на остальных тестовых примерах, а компилятор перескакивает на мой интерес. – InExperience

+0

Нет, не удаляйте всю аннотацию, просто «expected = IllegalArgumentException.class», если вы хотите увидеть ошибки! – Adelin

+0

, но мой тестовый код верен? \t @Test (ожидаемый = IllegalArgumentException.class) \t общественных недействительные test15() бросает исключение { \t \t нового RomanNumber ("") (МММММЫ ") validateState."; \t \t} – InExperience

0

Вы, кажется, спрашивают, почему

public void validateState(String number) { 
    if (!number.matches(...)) 
     throw new IllegalArgumentException("Invalid number"); 

    System.out.println("Invalid number"); 
} 

не бросает исключение и выводит сообщение об ошибке в то же время.

Причина в том, что когда исключение выбрасывается, оно будет распространять пропущенные утверждения до тех пор, пока исключение не будет обнаружено в приложении try ... catch. В этом случае вызов println будет пропущен. Это нормальное поведение Java ...

Если вы хотите исключение быть брошенным и сообщения для печати, написать это:

public void validateState(String number) { 
    if (!number.matches(...)) { 
     System.out.println("Invalid number"); 
     throw new IllegalArgumentException("Invalid number"); 
    } 
} 
Смежные вопросы