Тест Junit не пройден без трассировки ошибок

1

Я запускаю тесты JUnit из Eclipse и использую команду Assert.fail(message) всякий раз, когда я хочу, чтобы тест Assert.fail(message) с ошибкой. Проблема в том, что я всегда получаю сообщение вместе со всей трассой сбоя. Есть ли способ, чтобы JUnit отображал только сообщение, без трассировки стека?

  • 1
    Как вы проводите тест? Maven, Eclipse, автономный бегун JUnit?
  • 0
    Я использую набор тестов от Eclipse
Теги:
junit

4 ответа

0
Лучший ответ

Я нашел способ опрокинуть тест, не показывая длинный след неудачи. Вместо использования Assert.fail() я создаю свое собственное исключение и устанавливаю минимальную трассировку отказа:

public static void failTest(String message) throws MyTestFailure {
    System.err.println(message);
    MyTestFailure exception = new MyTestFailure(message);
    StackTraceElement elem = new StackTraceElement("com.my.package.Utils", "failTest", "failTest", 3);
    StackTraceElement elem1[] = new StackTraceElement[1];
    elem1[0] = elem;
    exception.setStackTrace(elem1);
    throw exception;
}

и таким образом я печатаю только сообщение, которое хочу напечатать, и одну строку после этого

2

Параметры Eclipse JUnit, доступные через окно → Настройки → Java → Junit позволяют разрезать трассировки стека для определенных классов исключений:

Изображение 174551

С этими настройками трассировка стека для теста:

@Test
public void test() {
    fail("Not yet implemented");
}

фильтруют:

Изображение 174551

Теперь попробуйте отменить "org.junit. *" (Или "junit.framework.Assert", в зависимости от того, какую версию JUnit вы используете) и повторите тест. Трассировка стека сразу становится пугающей:

Изображение 174551

Возможно, это функция, которую вы ищете.

0

Я бы просто переопределил printStackTrace() -methods для моего настраиваемого Throwable:

  • Исключение → ОШИБКА

  • AssertionError → FAILURE

import java.io.PrintStream;
import java.io.PrintWriter;

public class TestErrorException extends Exception{

    private static final long serialVersionUID = -3486394019411535690L;
    private String message;

    public TestErrorException(String message) {
        this.message = message;
    }

    @Override
    public void printStackTrace() {
        System.err.println(message);
    }

    @Override
    public void printStackTrace(PrintStream s) {
        s.println(message);
    }

    @Override
    public void printStackTrace(PrintWriter s) {
        s.println(message);
    }

}
0

Если тест выдает ошибку, тест, как правило, автоматически завершается без сообщения. Разумеется, вы могли бы исключить исключения и разрешить тест в предложении catch. Что-то вроде этого:

@Test
public void test()  {
   try {
      // your test
  } catch (Exception e) {
      fail("I caught an " + e.class.getSimpleName());
   }
}

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

  • 0
    Если тест выдает исключение, то я ожидаю, что он потерпит неудачу с данными об исключении вместе с возможной трассировкой стека. Но если я пытаюсь принудительно завершить тест (например, из-за результатов извлечения), используя Assert.fail (сообщение), все, что я хочу, - чтобы тест отображал это сообщение в трассировке ошибок.
  • 0
    Тогда мое предложение о ловле исключения должно сработать. Я добавил пример того, что я имею в виду.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню