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

Вернуться назад

28 апреля 2018

Предположим, что у вас имеется метод, который вместо логов просто выводит какой-то текст через стандартный поток вывода:

public class Example {

    public void doSomeLogic() {
        System.out.print("Test string");
    }
}

И перед вами встаёт задача написать юнит-тест на то, что данный метод действительно выводит данную строку. Для тестирования будем использовать библиотеку JUnit.

Если бы он просто возвращал её как результат своей работы, мы бы проверяли его через Assert.equals(). Но если мы хотим тестировать вывод, то перед началом теста нам надо создать свой собственный поток, подсунуть его как стандартный вывод, выполнить необходимые проверки, а затем вернуть всё обратно.

В качестве реализации потока будем использовать ByteArrayOutputStream, поскольку его можно легко преобразовать в строку. Тестовый класс будет выглядеть так:

public class ExampleTest {

    private ByteArrayOutputStream output = new ByteArrayOutputStream();

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

    @Test
    public void testString() {
        Example example = new Example();
        example.doSomeLogic();
        Assert.assertEquals("Test string", output.toString());
    }

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

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

Тэги: JUnit, Java.



Добавить комментарий

Ваше имя:
Текст комментария: