JUnit - Как протестировать основной метод, который принимает пользовательский ввод и соответственно печатает результат?

У меня есть калькулятор, который принимает ввод и печатает результат. Например: Вход в сканер:

2+3+4=

Отпечатки:

9.00

Я хочу протестировать этот основной метод в JUnit. Вот как далеко я зашел (Оператор - это класс):

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.PrintStream;

import org.junit.Before;
import org.junit.jupiter.api.Test;

class MainTester {
    
    private final ByteArrayOutputStream resultByte = new ByteArrayOutputStream();
    private final PrintStream result = System.out;

    @Before
    public void setUp() {
        System.setOut(new PrintStream(resultByte));
    }
    
    @Test
    void test() {
        Operator operator = new Operator();
        
        String input = "2+3+4 = ";
        InputStream in = new ByteArrayInputStream(input.getBytes());
        System.setIn(in);
    
        String[] args = null;       
        System.out.println(operator.main(args));
        assertEquals("9.00", resultByte.toString());
    }
}
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Управление транзакциями JDBC - это мощная функция, которая позволяет рассматривать группу операций с базой данных как единую единицу работы. Оно...
Выполнение HTTP-запроса с помощью Spring WebClient: GET
Выполнение HTTP-запроса с помощью Spring WebClient: GET
WebClient - это реактивный веб-клиент, представленный в Spring 5. Это реактивное, неблокирующее решение, работающее по протоколу HTTP/1.1.
Gradle за прокси-сервером
Gradle за прокси-сервером
Создайте проект Gradle под сетевым прокси.
1
0
328
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Тестировать намного проще, если вы разделите обязанности. Например. часть, которая вычисляет результат, не должна совпадать с той, которая считывает ввод и печатает вывод. Если бы у Operator был метод compute, который принимает строку с входными данными («2+3+4») и возвращает строку с результатом («9,00»). Затем вы можете проверить, возвращает ли этот метод ожидаемый результат. Затем ваш метод main прочитает ввод, передаст его compute и распечатает результат.

Что-то в этом роде:

String result = operator.compute("2+3+4");
assertEquals(result, "9.00");

«Как протестировать основной метод, который принимает пользовательский ввод и соответственно печатает результат?» - Я не думаю, что этот ответ касается того, как проверить основной метод.

Jeff Scott Brown 30.12.2020 15:32

Реальный вопрос заключается в том, как проверить вычисление. Тестирование путем анализа вывода консоли редко бывает правильным подходом. Если бы речь шла только о вводе-выводе, то это тоже был бы неверный подход, потому что он смешивал бы проверку ввода-вывода с вычислениями. Поэтому я предложил разделить обязанности (ввод-вывод, вычисления).

EricSchaefer 30.12.2020 15:49

«Настоящий вопрос заключается в том, как проверить вычисление». — Я неправильно понял исходный вопрос. Я удалил свой ответ, в котором показано, как проверить метод main. Спасибо.

Jeff Scott Brown 30.12.2020 16:09

Другие вопросы по теме