У меня есть калькулятор, который принимает ввод и печатает результат. Например: Вход в сканер:
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());
}
}
Тестировать намного проще, если вы разделите обязанности. Например. часть, которая вычисляет результат, не должна совпадать с той, которая считывает ввод и печатает вывод. Если бы у Operator был метод compute, который принимает строку с входными данными («2+3+4») и возвращает строку с результатом («9,00»). Затем вы можете проверить, возвращает ли этот метод ожидаемый результат. Затем ваш метод main прочитает ввод, передаст его compute и распечатает результат.
Что-то в этом роде:
String result = operator.compute("2+3+4");
assertEquals(result, "9.00");
Реальный вопрос заключается в том, как проверить вычисление. Тестирование путем анализа вывода консоли редко бывает правильным подходом. Если бы речь шла только о вводе-выводе, то это тоже был бы неверный подход, потому что он смешивал бы проверку ввода-вывода с вычислениями. Поэтому я предложил разделить обязанности (ввод-вывод, вычисления).
«Настоящий вопрос заключается в том, как проверить вычисление». — Я неправильно понял исходный вопрос. Я удалил свой ответ, в котором показано, как проверить метод main. Спасибо.
«Как протестировать основной метод, который принимает пользовательский ввод и соответственно печатает результат?» - Я не думаю, что этот ответ касается того, как проверить основной метод.