Я запускаю тесты JUnit из Eclipse и использую команду Assert.fail(message)
всякий раз, когда я хочу, чтобы тест Assert.fail(message)
с ошибкой. Проблема в том, что я всегда получаю сообщение вместе со всей трассой сбоя. Есть ли способ, чтобы JUnit отображал только сообщение, без трассировки стека?
Я нашел способ опрокинуть тест, не показывая длинный след неудачи. Вместо использования 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;
}
и таким образом я печатаю только сообщение, которое хочу напечатать, и одну строку после этого
Параметры Eclipse JUnit, доступные через окно → Настройки → Java → Junit позволяют разрезать трассировки стека для определенных классов исключений:
С этими настройками трассировка стека для теста:
@Test
public void test() {
fail("Not yet implemented");
}
фильтруют:
Теперь попробуйте отменить "org.junit. *" (Или "junit.framework.Assert", в зависимости от того, какую версию JUnit вы используете) и повторите тест. Трассировка стека сразу становится пугающей:
Возможно, это функция, которую вы ищете.
Я бы просто переопределил 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);
}
}
Если тест выдает ошибку, тест, как правило, автоматически завершается без сообщения. Разумеется, вы могли бы исключить исключения и разрешить тест в предложении catch. Что-то вроде этого:
@Test
public void test() {
try {
// your test
} catch (Exception e) {
fail("I caught an " + e.class.getSimpleName());
}
}
Конечно, как всегда, имея дело с исключениями, будьте как можно точнее, когда вы их поймаете.