2016-11-28 2 views
3

Во время тестирования для значения сообщения от выброшенных сообщения исключений, как это:Не отображать StackTrace брошенных сообщения исключений в тесте JUnit

public void mustFailIfTheActionDoesNotExist() { 
     try { 
      getAction(UUID.randomUUID().toString()); 

      fail("Must fail if the action does not exists"); 
     } catch (MyException ex) { 
      Assert.assertEquals("Exception generated on action", ex.getMessage()); 
     } 

исключения и их StackTrace видно на терминале. Поскольку у меня есть сотни классов в моем проекте, терминал просто становится длинным списком stacktraces сообщений об исключениях.

Есть ли способ подавить вывод стека вывода исключений на экран/терминал при выполнении тестов Junit?

PS: Я не хочу подавлять регистрацию для всех модульных тестов, как раз в конкретных случаях.

+0

Вы можете закрыть выходной поток, но вам нужно будет его снова открыть в конце этого тестового примера. – AxelH

+0

Это похоже на то, что вы говорите: http: // stackoverflow. ком/а/33871861/3285138. Но мне жаль, что я не могу просто отключить stacktrace, поскольку это тот, который в основном занимает пространство. – goelakash

+0

Хорошо, что вы используете для регистрации? Вы можете перенаправить потоки с помощью 'System.setOut (PrintStream)' и 'System.setErr (PrintStream)'. Сохраните их где-нибудь, затем переопределите их в файл (чтобы сохранить дорожки) или закройте их, чтобы скрыть все. Затем в конце сбросьте сохраненный экземпляр в экземпляр системы. – AxelH

ответ

1

В следующем тесте вы можете проверить, выбрано ли исключение. Но вы не можете пройти тест (например, сбой) после того, как будет выбрано исключение. Они не будут выполнены. Также он не будет печатать stacktrace.

@Test(expected = MyException.class) 
public void mustFailIfTheActionDoesNotExist() throws MyException{ 
    getAction(UUID.randomUUID().toString()); 
    fail("Must fail if the action does not exists"); 
} 

Для проведения испытаний после исключения. Вы можете посмотреть ExpectedException Rule.

Update:

@Rule 
public ExpectedException exception = ExpectedException.none(); 
@Test 
public void shouldNotPrintStackTrace() throws ArithmeticException { 
    exception.expect(ArithmeticException.class); 
    exception.expectMessage(containsString("by zero")); 
    System.out.println(10/0); 
} 

Приведенный выше код оленья кожа шоу StackTrace в случае успеха, и вы можете проверить это сообщение. В случае неудачи теста он печатает stacktrace.

+0

Это не позволит мне проверить сообщение об исключении. ExpectedException позволяет мне это сделать, но также печатает трассировку стека. – goelakash

+0

@goelakash, пожалуйста, см. Мой обновленный ответ. Не могли бы вы поделиться своим кодом с ExpectedException, тогда мы могли бы видеть, что не работает. – selimssevgi

0

Я предполагаю, что код, который вы тестируете, регистрирует исключение и бросает его. Не делай этого.

При ловле исключения в не-тестовом коде, сделайте один из них:

  1. Log исключение и перейти
  2. Rethrow исключения без его регистрации
  3. Wrap исключения и бросить обернутое исключение без ведения каротажа

Если вы сделаете это, любое исключение будет регистрироваться не более одного раза.

Вы также должны следить за тем, чтобы все исключения регистрировались на верхнем уровне вашего кода. Для этого может потребоваться вызов Thread.setDefaultUncaughtExceptionHandler() или `Thread.setUncaughtExceptionHandler()

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