3 мая 2014 г.

Тестирование System.out.print

Актуальная версия статьи на моём новом сайте devmark.ru

Пусть у вас есть метод, который выводит сообщение на экран и вам необходимо его протестировать.

package developer.remarks;

public class BusinessLogic {

public void doWork() {
System.out.print("some text");
}
}

Как протестировать текст сообщения, выведенный на экран, ведь данный метод ничего не возвращает? Предлагаю создать вспомогательный абстрактный класс, в котором перед началом тестирования происходит перенаправление стандартного потока вывода, а после тестирования всё возвращается на изначальные позиции.

package developer.remarks;

import org.junit.After;
import org.junit.Before;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

public abstract class OutputTest {

protected final ByteArrayOutputStream output = new ByteArrayOutputStream();

@Before
public void setUpStreams() {
System.setOut(new PrintStream(output));
}

@After
public void cleanUpStreams() {
System.setOut(null);
}
}

Здесь метод с аннотацией @Before вызывается перед каждым методом, помеченным аннотацией @Test, а метод с аннотацией @After - после выполнения этого теста. Таким образом, всё, что было выведено на экран, можно получить при помощи output.toString().

Привожу пример такого теста:

package developer.remarks;

import org.junit.Assert;
import org.junit.Test;

public class BusinessLogicTest extends OutputTest {

@Test
public void testString() {
BusinessLogic logic = new BusinessLogic();
logic.doWork();
Assert.assertEquals("some text", output.toString());
}
}

Важно заметить, что если бы мы использовали метод System.out.println в тестируемом методе, то после каждого такого вывода добавлялся бы символ перевода строки ("\n").

2 комментария: