Возможный Дубликат: каков лучший способ закрытых методов поблочного тестирования?
Я - программист новичка, и я не знаю, как записать приложение, которое будет хорошо структурировано для поблочного тестирования. Я хочу записать приложения со способностью впоследствии добавить тесты годного изделия.
Проблема с
private
методы - они не могут тестировать с за пределами их классов.Если я решаю эту проблему путем изменения всех методов, которые являются
private
кому:protected
, и позвольте тестовому классу расширить исходный класс? Или есть ли лучшее решение?Мое решение (частный splitLetters => защитил splitLetters) будет работать как это:
Исходный класс:
class MyClass{ protected splitLetters(int num){ return num+2; } }
Тестовый класс:
class Test_MyClass extend MyClass{ public splitLettersTest(){ for(int i=0;i<100;i++){ System.println(parent.splitLetters(i)); } } }
Решения:
Не тестируя закрытые методы - Иногда закрытый метод делает очень сложные задачи, которые должны быть протестированы очень хорошо, и мы не хотим того пользователя, будет иметь доступ к этому методами. Скоро решение изменяет закрытые методы для защищенного.
Вложенный способ класса протестировать - проблематичный, потому что QA вносит изменения в исходном коде
Отражение - Если это позволяет назвать закрытые методы, это похоже на отличное решение http://www.artima.com/suiterunner/private3.html (я должен узнать больше для понимания отражения. Я не понимаю, как отражения не повреждают всю идею наличия открытых и закрытых методов, если мы можем назвать закрытые методы от другого класса.)
Не определяют закрытые методы (когда я показал в своем решении) - проблематичный, потому что иногда мы должны определить закрытый метод.
Вам не нужно тестировать частные методы.
Тестирование частных методов подразумевает тестирование реализации, а не функциональности. Подумайте очень тщательно о том, зачем вы хотите тестировать частные методы, и вы можете обнаружить, что вам вообще не нужно их тестировать.
Я лично считаю, что вам следует (по возможности) тестировать только поведение, доступное конечному пользователю этой функциональности, и поэтому вам не следует тестировать частные методы:
Тест ничего не доказывает за исключением того, чтобы показать, что часть внутренней функциональности «работает» в соответствии с чем-то, что не имеет смысла для людей, фактически использующих ваше программное обеспечение.
Если вы измените / перефакторите свою внутреннюю реализацию, вы можете обнаружить, что ваши модульные тесты начинают давать сбой, когда на самом деле открытая внешняя функциональность вообще не изменилась!
Конечно, вы можете разделить большие проекты на более мелкие функциональные блоки, и в этом случае вы можете выбрать модульное тестирование интерфейсов между интерфейсами (например, вы можете выбрать модульное тестирование уровня доступа к данным, несмотря на то, что что реализация DAL не влияет напрямую на конечного пользователя).
На мой взгляд, частные методы не должны быть проверенным. Тесты предназначены для интерфейсов (в широком смысле этого слова).
Вам не нужно тестировать частные методы. Когда вы тестируете свои общедоступные методы, теоретически они должны тестировать и ваши частные методы.