2016-06-21 3 views
-1

Вот тест:Создание этого JUnit Test проходят

@Test 
public void invalidPort() { 
    try { 
     SS.main(SS_ARGS); 
     assertTrue(false); 
    } catch (Exception e) { 
     assertTrue(true); 
    } 
} 

Вот соответствующий код в СС:

public static void main(String[] args) { 
    try { 

     if (obj.start() == 0) { 
      ...stuff 
     } 
    } catch (BindException e) { 
     System.out.println("Address already in use."); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Это то, что obj.start() делает:

public int start() { 
    try { 
     HttpServer server = HttpServerFactory.create(serverURI); 
     this.server = server; 
     server.start(); 
     return 0; 
    } catch (NullPointerException e) { 
     System.out.println("Error: Please specify the server URI"); 
     return 1; 
    } catch (Exception e) { 
     System.out.println("Error: Invalid port!"); 
     return 1; 
    } 


} 

В этом тесте я уверен, что порт недействителен. При запуске программа выводит «Ошибка: неверный порт!». что хорошо, но тест не проходит. Он терпит неудачу, потому что он достигает строки assertTrue (false). Как я могу пройти этот тест?

+0

Удалите строку 'assertTrue (false)', которая всегда будет * сбой теста? – Robert

+0

OP использует это в идиоме для проверки ожидаемых исключений. –

+0

Но 'assertTrue (true)' is no-op. –

ответ

3

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

Вывод консоли, который вы упоминаете, происходит из блока catch исключения. Если вы поймаете исключение, оно исчезнет и не будет передано на тест.

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

+0

Итак, как мне пройти этот тест. Должен ли я не поймать исключение в моей программе? Затем, когда пользователь запускает мою программу, они получат неприятное сообщение об ошибке трассировки стека, если они дают недопустимый порт. – Infamous911

+0

Если у вашего метода начала есть коды возврата, почему бы не проверить метод запуска для правильных кодов возврата? –

+0

Потому что есть довольно сложный набор вещей, который случается, когда я даю неверный порт (синтаксический анализ файла и т. Д.). Я хочу быть уверенным, что все работает до такой степени, что порт определен как недействительный. Я уже знаю, что метод start вернет 1, когда URI, который он задает (который содержит порт), недействителен, это не то, что я хочу проверить здесь. – Infamous911

0
@Test(expected=IllegalStateException.class) 
public void invalidPort() { 
     SS.main(SS_ARGS); 
} 

Замените IllegalStateException на реальную реализацию исключения, которую вы ожидаете. (Возможно, вы должны исключать исключение из своего основного метода, а не просто записывать его в stderr?)

+0

Хотя я не хочу исключать исключение из своего основного метода. Я хочу поймать исключение и распечатать информативное и приятное сообщение об ошибке. Как я могу проверить это в тесте JUnit? – Infamous911

+0

В этом случае вы, вероятно, должны перенести логику ведения журнала на отдельный метод/класс.Затем вы можете использовать фреймовую фреймворк (например, EasyMock, JMock или Mockito), чтобы проверить правильность вызова журнала. – nasukkin