System.out.print не выводит на консоль при запуске из Junit

Во время работы:

public static void main(String... args) throws InterruptedException {
    while (true) {
        System.out.print(".");
        Thread.sleep(200);
    }
}

по сравнению с запуском того же кода из junit:

@Test
public void test() throws Exception {
    while (true) {
        System.out.print(".");
        Thread.sleep(200);
    }
}

Существует другое поведение:
для main() - вывод отображается, как и ожидалось, по мере выполнения процесса ("." -> ".." -> "...")

однако для JUnit при запуске одного и того же фрагмента кода вывод не отображается во время выполнения процесса - он сбрасывается только при выходе из теста.

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

Мне нужно печатать в ту же строку, поэтому использование println не подходит.


person Lika    schedule 22.05.2016    source источник
comment
с println это работает, но мне нужно без новой строки...   -  person Lika    schedule 22.05.2016
comment
Почему? Тесты Junit не должны нуждаться в человеческом взаимодействии.   -  person Thorbjørn Ravn Andersen    schedule 22.05.2016
comment
Я думаю, что об этом уже спрашивали и отвечали здесь: stackoverflow.com/questions/1119385/   -  person Peter Isberg    schedule 22.05.2016
comment
Он отлично работает... Я запускал то же самое в Eclipse IDE. Он печатает точки в одной строке каждые 200 мс. Пожалуйста, проверьте IDE один раз.   -  person Sunil Dabburi    schedule 22.05.2016


Ответы (3)


Есть много способов запустить тесты JUnit (из среды IDE, из системы сборки, такой как Maven, или из командной строки, которая напрямую использует библиотеку JUnit). Похоже, что то, как вы его запускаете, использует стандартный вывод, который не сбрасывается при каждом выводе. (Вероятно, это сделано намеренно, так как часто тесты запускаются в пакетном режиме с использованием системы непрерывной интеграции, а журналы проверяются позже, поэтому отказ от сброса при каждой записи может повысить производительность.)

Но если вам нужно очистить буфер явно, попробуйте использовать System.out.flush(); после каждого .print вызова.

Другой вариант, в зависимости от того, что вы на самом деле хотите сделать, может заключаться в использовании более полнофункциональной системы ведения журнала, чем встроенный поток System.out.

person Community    schedule 24.05.2016
comment
Спасибо за объяснение, похоже, причина в этом, но явное использование System.out.flush(); после каждого .print(.) также не отображается вывод (при запуске из IntelliJ IDE). println(.) с другой стороны отображает вывод... - person Lika; 29.05.2016
comment
У меня также есть эта проблема при работе с муравьем - person bikashg; 25.08.2017

Ctrl + Shift + p и введите показать тестовый вывод. В качестве альтернативы вы можете открыть окно вывода (Ctrl + J) и выбрать просмотр вывода теста из поля со списком в правом верхнем углу.

person Leandro Tavares    schedule 09.06.2018

Это по-прежнему не работает в IntelliJ 2019. *вздох*

@Test
public void test() throws Exception {
    while (true) {
        System.out.print(".");
        Thread.sleep(200);
    }
}

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

@Before
public void forceConsoleOutput()
{
    new Thread( () -> {
        for ( ; ; )
        {
            // Does nothing. Why JetBrains?
            // System.out.flush();

            System.out.println();
            try
            {
                Thread.sleep( 5000 );
            }
            catch ( InterruptedException e )
            {
                e.printStackTrace();
            }
        }
    } )
    {{
        start();
        System.out.println( "Terminated" ); // The threads naturally stop between method tests
    }};
}
person Drakes    schedule 16.02.2019