Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > JUnit для приватных методов |
Автор: nitzshe 17.3.2009, 18:12 |
Всем добрый день. Никто не подскажет как применить JUnit для приватных методов с передачей параметров? |
Автор: Shaggie 17.3.2009, 18:48 |
Тестируй публичный контракт класса и контролируй покрытие кода тестами. Тебя не должно волновать выполнение приватного метода. Главное - ожидаемое поведение публичных методов при любых инвариантах входных параметров. По-хорошему, в результате выполнения тестов приватный код должен быть полностью покрыт выполнением тестов публичных методов. Если часть кода приватных классов осталась непокрытой тестами - задумайся, нужен ли тебе этот код, и не правильнее ли просто удалить его. В некоторых случаях имеет смысл как следует подумать и вынести приватный метод в публичный контракт другого класса. Возможно, ему там самое место. |
Автор: nitzshe 18.3.2009, 15:02 |
Спасибо большое. Вы правы. Сам уже до этого додумался. Но с помощью рефлексии несколько методов обхватил тестами Вот ссылочку нашел: http://www.jroller.com/CoBraLorD/category/Java |
Автор: Shaggie 18.3.2009, 15:36 |
Нехорошо. В таком случае тестируется не публичный контракт класса, а детали реализации, которые меняются заметно чаще. И исправление внутренних деталей работы класса, не ведущее к изменению контракта (и прекрасно проходящее все тесты публичных методов), заставит переписывать кучу тестов и убить впустую немало времени. |
Автор: niasilil 19.3.2009, 02:01 |
Иногда удобно пользозвать junit для тестирования по ходу дела. Я обычно делаю методы protected и гоняю тест юнит пока не получу требуемый результат. Потом меняю на private и тест кейсы стираю. |
Автор: pompei 19.3.2009, 05:07 | ||||
Вообще тестирующий класс должен находиться в том же пакете что и тестируемый например ru.yourfirma.coolproject.asd.MyCoolClass - тестируемый класс ru.yourfirma.coolproject.asd.MyCoolClassTest - тестирующий класс только естественно они должны находиться в разных src-папках (и тестовая src-папка не будет вкомпилироваться в готовый продукт). В этом случае если у вас есть какой-нибудь внутренний метод в MyCoolClass, и который вы не хотите открывать всем, то вы делаете этот метод с доступом на уровне пакета и он становиться видимым из MyCoolClassTest - и его можно тестировать. Но если же вы очень настырный и вообще не хотите трогать префикс private но хотите этот метод протестировать, то единственный выход - reflection Добавлено @ 05:17
А если в будущем вам придется поменять функционал этого метода? (сопровождение же ещё ни кто не отменял) То вам придётся писать тест заного. Но этого делать вы не будете (пожелеете время - ведь при сопровожении обычно всё надо делать быстро). Вы будете менять на свой страх и риск - потом чето не заработает - придется ставить что-то типа System.out.println(...) - как всегда где-то вылезет надоедливый NullPointerException - придётся вставлять дополнительные if-ы. Ещё раз запустить приложение целиком. И ещё раз. И ещё раз. И ещё раз.... И если таких мест будет куча, то сопровождение превратиться в муку, а система в неподъемного мостра, от упоминания которого вы будете вздрагивать, а по ночам вам будут сниться кошмары с NullPoinerException-ами, которые размножаются как кролики и их становиться так много что вы начинаете задыхаться и вдруг просыпаетесь весь в поту.................... |
Автор: niasilil 19.3.2009, 05:50 | ||||
[QUOTE=pompei,19.3.2009, 05:07]
сопровождение - это maintenance по английски, да? вобщем, где то так и есть, только сплю хорошо. ![]() Только тест кейсы на public методы не стираются же, так что все нормально с тестированием в этом отношении. |
Автор: Samotnik 19.3.2009, 11:20 |
поставить им другой спецификатор доступа, потестировать, затем обратно выставить private Добавлено через 1 секунду поставить им другой спецификатор доступа, потестировать, затем обратно выставить private |
Автор: pompei 19.3.2009, 13:33 | ||
а как в таком случае будет работать ночное тестирование? Самый нормальный вариант закрытые методы, которые надо протестировать надо делать пакетными - это даже супер-пупер гуру типа Мартина Фаулера советуют делать. |
Автор: Saboteur 19.3.2009, 19:27 |
А нельзя создать внутренний класс, который будет иметь доступ ко всем частям внешнего?![]() Кстати: http://www.onjava.com/pub/a/onjava/2003/11/12/reflection.html и http://www.artima.com/suiterunner/private.html |
Автор: Samotnik 20.3.2009, 09:36 |
Saboteur, будем ссылками меряться ??? Окей. Вот http://tinyurl.com/d5ow4c ![]() ![]() ![]() ![]() |
Автор: Saboteur 20.3.2009, 20:46 |
Samotnik, не поверишь, я даже так делал, ![]() ![]() |