2015-05-01 2 views
1

Я пишу тест модуля Java для одного из моих методов. Объявление метода таково:Управление проверенными исключениями в разных тестах JUnit

public int convertToInteger() throws InvalidRomanNumberException 
{ 
    int result=0; 
    BaseRomanNumeral num1, num2; 
    int i=0; 
    if(!validOperation()) 
     throw new InvalidRomanNumberException(); 
} 

Теперь я пытаюсь написать два модульных теста. Один из них - проверить, выбрано ли правильное исключение. Другой - убедиться в том, что происходит преобразование записи. Это как мой тест выглядит

@Test 
public void testRomanNumberConversion() { 
    String romanValue="MCMII"; 
    RomanNumber num=new RomanNumber(romanValue); 
    assertEquals(1903,num.convertToInteger()); 
} 

@Test(expected = InvalidRomanNumberException.class) 
public void testInvalidRomanNumberExceptionThrown() { 
    String romanValue="MCMIIII"; 
    RomanNumber num=new RomanNumber(romanValue); 
    num.convertToInteger(); 
} 

Для обоих этих тестов я получаю сообщение об ошибке говорящее Необработанное InvalidRomanNumberException. Это разрешается только тогда, когда я добавляю броски InvalidRomanNumberException для каждого определения метода. Но я не думаю, что это правильный путь. Просто хочу проверить с остальными, что здесь является нормой? Как мне решить это необработанное сообщение об исключении

ответ

1

Поскольку это выглядит как InvalidRomanNumberException является проверяемым исключением, вы должны либо окружить его с try-catch или объявить, что метод throws InvalidRomanNumberException. JUnit или нет, это норма.

При этом, метод тест, который вы expect выбросит InvalidRomanNumberException в идеале должен заявить, что оно throws один, так как нет никакого смысла подавлять его с try-catch как ваш тест случае потерпит неудачу. С другой стороны, метод проверки, который вы ожидаете, не будет генерировать исключение, может использовать try-catch вокруг метода convertToInteger и независимо от того, выбрано ли исключение, этот тестовый пример должен иметь assert по ожидаемому результату от convertToInteger.

Конечным результатом тестового примера JUnit должно быть то, прошел или не прошел тест. Исключение во время выполнения не укажет ни на одно. Тест JUnit не должен аварийно завершаться.

+0

так что ваше предложение - я просто добавляю броски InvalidRomanNumberException справа. И если есть исключение, то тест просто потерпит неудачу. Поэтому нет необходимости добавлять try catch в другое место в программе для этого тестового метода, который бросает исключение – gazubi

+0

@bob_d: Нет.Мое предложение состоит в том, что метод, в котором вы не ожидаете исключения, должен использовать «try-catch», а тот, который вы ожидаете, должен использовать «throws». В первом случае вы должны утверждать результат, который вы ожидаете от метода convertToInteger, независимо от того, выбрано ли исключение или нет. В дальнейшем вы утверждаете, что исключение «ожидается». См. Мое редактирование последних нескольких строк во втором абзаце. – CKing

+1

спасибо, это звучит вполне логично – gazubi

3

Это больше похоже на то, что это должно быть un проверенное исключение в отличие от проверенного исключения.

Вспомните разницу между двумя: проверенное исключение предназначено для того, чтобы быть приемлемым для восстановления, например, отсутствующим файлом или неправильным URL. Исключенное исключение/время выполнения предназначено для того, чтобы быть безвозвратным, например делением на ноль.

Если пользователь вводит недействительные римские цифры, может не иметь смысла говорить, что они могут восстановить и повторить попытку - конвертер не должен нести ответственность за это. Это звучит скорее как вещь должна быть определена во время создания.

Если вы вместо этого сделаете свое собственное исключение, заполните RuntimeException, тогда вам не нужно будет объявлять его брошенным (и если бы вы это сделали, это не повлияло бы), и вам не придется иметь дело с это в ваших тестах.

Альтернативой было бы объявить, что оно будет выбрано в ваших тестах. Это имеет то преимущество, что вы можете сохранить эти исключения, как указано и, гарантируя, что тесты не будут жаловаться на то, что вы не обработаете потенциальное исключение из того, чтобы быть неотображаемым или отброшенным.

@Test 
public void testRomanNumberConversion() throws InvalidRomanNumberException { 
    String romanValue = "MCMII"; 
    RomanNumber num = new RomanNumber(romanValue); 
    assertEquals(1903, num.convertToInteger()); 
} 

@Test(expected = InvalidRomanNumberException.class) 
public void testInvalidRomanNumberExceptionThrown() throws InvalidRomanNumberException { 
    String romanValue = "MCMIIII"; 
    RomanNumber num = new RomanNumber(romanValue); 
    num.convertToInteger(); 
} 
+0

Я не совсем согласен с предложением объявить 'throws' для всех методов тестовых случаев. Тест, который не ожидает исключения, не должен приводить к исключению программирования во время выполнения из-за исключения. Тест JUnit не должен терпеть крах. Он должен утверждать окончательный результат метода «convertToInteger», подавляя любые исключения. Конечным результатом такого теста является проверка или провал теста. Исключение во время выполнения не укажет ни на одно. – CKing

+0

Эй спасибо за подробное объяснение. Это действительно помогает мне понять проверенные и непроверенные исключения лучше – gazubi

+1

@ChetanKinger: Я не обязательно не согласен с вашими чувствами, поэтому я предложил изменить его на неконтролируемое исключение * first *. Я убежден, что исключения, которые действительно восстанавливаются, должны быть проверены, но в этом сценарии я чувствую, что подобное объявление в порядке. Единственный способ, которым было бы выбрано вышеописанное исключение, - это ввести недействительную римскую цифру и, по крайней мере, с первым тестовым примером, это не произойдет. – Makoto

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

  • Нет связанных вопросов^_^