2016-04-01 6 views
10

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

+3

Не могли бы вы протестировать методы обработки? Это было бы намного более эффективно. – Berger

+0

У меня есть проверенные методы, они работают нормально, но я хочу протестировать основной метод. – user2719152

+1

«Основной» метод Java-программы - это просто ... метод! Его также можно вызывать любым другим методом (особенно из метода тестирования). Итак, какая у вас проблема? – Seelenvirtuose

ответ

6

Чтобы обеспечить ввод из файла, сделать 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 и использовать что-то лучше, чем полный путь к файлу (получить его через загрузчик классов), но это дает вам общую идею.

+0

Но fips будет читать только первую строку. как я могу перейти к следующей строке в файле? – user2719152

+0

Работает отлично с несколькими строковыми файлами для меня, когда я использую «Сканер». Думаю, это будет зависеть от вашего основного метода? –

1

Вы можете назвать основной метод из теста JUnit, как это:

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

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

Вот ссылка How do I test a method that doesn't return anything?

+0

да, мы можем так называть после выполнения этой основной функции меняет свое поведение .... и я не хочу его менять. – user2719152

5

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

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

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

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

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

Либо какая-либо форма подделок, введенная в действие или использование правила TemporaryFolder JUnit.

+0

Я часто вижу такие комментарии, где предлагается «правильная вещь». И хотя я всегда согласен, помните, что мы редко знаем всю полноту ситуации. Иногда вам поручено тестировать чужой скрюченный код или устаревший треск, который нельзя/не разрешить изменять. –

+0

Хотя верно, что «правильный путь» в этом случае вполне может состоять в том, чтобы не делать это «правильным путем», я думаю, что важно правильно выбрать список ответов. Если новый разработчик натыкается на эту страницу и видит «неправильный путь» без каких-либо указателей на «правильный путь», они могут уйти с неправильной идеей. –

+0

Не могу с этим спорить. Весьма вероятно, что если он проверит основной метод, он написал это. –