2014-01-04 2 views
1

Я хочу создать тестовый класс JUnit, который проверяет очень простой метод.JUniting простой ввод пользователя?

public static String whatsYourName() { 
    System.out.println("Input your name:"); 
    yourName = in.next(); 
    return yourName; 
}. 

Мой вопрос был рассмотрен как вы могли протестировать простой метод, как указано выше. Я думаю, что решение ниже идеально!

+1

Здесь нет никаких вопросов ... – Keppil

+1

Что такое 'in'? Вы можете предоставить свой собственный входной поток, который предоставляет известные данные, и убедитесь, что метод возвращает ожидаемый результат. – assylias

+0

Не могли бы вы подробно остановиться? – Laresh

ответ

2

я бы первым изменить способ взять сканер в качестве (принципы нагнетательных зависимостей) аргумент:

public static String whatsYourName(Scanner in) { 
    System.out.println("Input your name:"); 
    yourName = in.next(); 
    return yourName; 
} 

Тогда становится легко тест:

@Test public void testName() { 
    Scanner in = new Scanner("my name"); 
    assertEquals("my name", whatsYourName(in)); 
} 

Теперь, только тесты, что ваши метод извлекает правильную информацию из Сканера, он не проверяет, что пользователь может что-то ввести, но это будет частью ваших интеграционных тестов, а не модульных тестов.

Также обратите внимание, что ваш метод, по существу, эквивалентно return in.next(); так вы на самом деле тестирования next метод Scanner, который является ненужным. Но если метод будет более сложным, будет применяться принцип.

Очень интересная деталь для чтения: Google guide on Writing Testable Code.

+0

Удивительная работа. Вы только что взяли меня от невежества о JUnit, чтобы по крайней мере понять это :) Спасибо – Laresh

+1

Я взял тест, и он потерпел неудачу, потому что .next принимает только следующий жетон :) – Laresh

Смежные вопросы