Тестирование основного метода junit

Я написал класс, который принимает входные данные из консоли и аргументы в основном методе. Основной метод вызывает разные методы для разных консольных входов и вызывает разные функции для разных аргументов. Поэтому я хочу протестировать этот основной метод с помощью Junit, подражая этим входам из файла. как мне это сделать? Есть ли какое-либо специальное условие в junit для проверки основного метода класса?

Ответ 1

Чтобы обеспечить ввод из файла, сделайте FileInputStream и установите его как поток System.in. Вероятно, вы захотите установить исходный текст после завершения основного метода, чтобы убедиться, что все его использование позже работает (другие тесты, сам JUnit...)

Вот пример:

@Test
public void testMain() throws IOException {
    System.out.println("main");
    String[] args = null;
    final InputStream original = System.in;
    final FileInputStream fips = new FileInputStream(new File("[path_to_file]"));
    System.setIn(fips);
    Main.main(args);
    System.setIn(original);
}

В вашем фактическом коде вы хотите обрабатывать любые IOExceptions и использовать что-то лучше, чем полный путь к файлу (получить его через загрузчик классов), но это дает вам общую идею.

Ответ 2

IMO - лучший способ протестировать основной метод - это сделать основной метод абсолютно ничего, кроме как настроить мир и оттолкнуть его. Таким образом, один простой тест интеграции дает ответ "настроен мир".

Тогда все остальные вопросы станут намного легче ответить.

Основной метод вызывает разные методы для разных входов в консоль и вызывает разные функции для разных аргументов.

Он не должен, он должен называть someService.somemethod(args). Эта служба тестируется, как и любая другая.

Итак, я хочу протестировать этот основной метод с помощью Junit, подражая этим входам из файла. как мне это сделать?

Любая форма подделок, введенная или использующая правило TemporaryFolder JUnit.

Ответ 3

Вы можете вызвать основной метод из теста junit следующим образом:

YourClass.main(new String[] {"arg1", "arg2", "arg3"});

Но поскольку основной метод недействителен и ничего не возвращает, вы должны проверить объект, который изменился после основного вызова;

Вот ссылка Как проверить метод, который ничего не возвращает?