Актуальная версия статьи на моём новом сайте 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").
Круто! Спасибо! Работает!
ОтветитьУдалитьОчень помог!
ОтветитьУдалить