Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(nitzshe @  18.3.2009,  15:02 Найти цитируемый пост)
Но с помощью рефлексии несколько методов обхватил тестами 

Нехорошо. В таком случае тестируется не публичный контракт класса, а детали реализации, которые меняются заметно чаще. И исправление внутренних деталей работы класса, не ведущее к изменению контракта (и прекрасно проходящее все тесты публичных методов), заставит переписывать кучу тестов и убить впустую немало времени.

Автор: niasilil 19.3.2009, 02:01
Иногда удобно пользозвать junit для тестирования по ходу дела. Я обычно делаю методы protected и гоняю тест юнит пока не получу требуемый результат. Потом меняю на private и тест кейсы стираю. 

Автор: pompei 19.3.2009, 05:07
Цитата(nitzshe @ 17.3.2009,  18:12)
Всем добрый день.

Никто не подскажет как применить JUnit для приватных методов с передачей параметров?

Вообще тестирующий класс должен находиться в том же пакете что и тестируемый например

ru.yourfirma.coolproject.asd.MyCoolClass - тестируемый класс

ru.yourfirma.coolproject.asd.MyCoolClassTest - тестирующий класс

только естественно они должны находиться в разных src-папках (и тестовая src-папка не будет вкомпилироваться в готовый продукт).

В этом случае если у вас есть какой-нибудь внутренний метод в MyCoolClass, и который вы не хотите открывать всем,
то вы делаете этот метод с доступом на уровне пакета и он становиться видимым из MyCoolClassTest - и его можно тестировать.

Но если же вы очень настырный и вообще не хотите трогать префикс private но хотите этот метод протестировать,
то единственный выход - reflection

Добавлено @ 05:17
Цитата(niasilil @ 19.3.2009,  02:01)
Иногда удобно пользозвать junit для тестирования по ходу дела. Я обычно делаю методы protected и гоняю тест юнит пока не получу требуемый результат. Потом меняю на private и тест кейсы стираю.

А если в будущем вам придется поменять функционал этого метода? (сопровождение же ещё ни кто не отменял)
То вам придётся писать тест заного. Но этого делать вы не будете (пожелеете время - ведь при сопровожении обычно всё надо делать быстро).
Вы будете менять на свой страх и риск - потом чето не заработает - придется ставить что-то типа System.out.println(...) - как всегда где-то
вылезет надоедливый NullPointerException - придётся вставлять дополнительные if-ы. Ещё раз запустить приложение целиком. И ещё раз. И ещё раз. И ещё раз....

И если таких мест будет куча, то сопровождение превратиться в муку, а система в неподъемного мостра,
от упоминания которого вы будете вздрагивать, а по ночам вам будут сниться кошмары с NullPoinerException-ами,
которые размножаются как кролики и их становиться так много что вы начинаете задыхаться и вдруг просыпаетесь
весь в поту....................

Автор: niasilil 19.3.2009, 05:50
[QUOTE=pompei,19.3.2009,  05:07]
Цитата(nitzshe @ 17.3.2009,  18:12)
Добавлено @ 05:17
Цитата(niasilil @ 19.3.2009,  02:01)
Иногда удобно пользозвать junit для тестирования по ходу дела. Я обычно делаю методы protected и гоняю тест юнит пока не получу требуемый результат. Потом меняю на private и тест кейсы стираю.

А если в будущем вам придется поменять функционал этого метода? (сопровождение же ещё ни кто не отменял)
То вам придётся писать тест заного. Но этого делать вы не будете (пожелеете время - ведь при сопровожении обычно всё надо делать быстро).
Вы будете менять на свой страх и риск - потом чето не заработает - придется ставить что-то типа System.out.println(...) - как всегда где-то
вылезет надоедливый NullPointerException - придётся вставлять дополнительные if-ы. Ещё раз запустить приложение целиком. И ещё раз. И ещё раз. И ещё раз....

И если таких мест будет куча, то сопровождение превратиться в муку, а система в неподъемного мостра,
от упоминания которого вы будете вздрагивать, а по ночам вам будут сниться кошмары с NullPoinerException-ами,
которые размножаются как кролики и их становиться так много что вы начинаете задыхаться и вдруг просыпаетесь
весь в поту....................

сопровождение - это maintenance по английски, да? 
вобщем, где то так и есть, только сплю хорошо.  smile 
Только тест кейсы на public методы не стираются же, так что все нормально с тестированием в этом отношении. 

Автор: Samotnik 19.3.2009, 11:20
поставить им другой спецификатор доступа, потестировать, затем обратно выставить private

Добавлено через 1 секунду
поставить им другой спецификатор доступа, потестировать, затем обратно выставить private 

Автор: pompei 19.3.2009, 13:33
Цитата(Samotnik @ 19.3.2009,  11:20)
поставить им другой спецификатор доступа, потестировать, затем обратно выставить private

Добавлено @ 11:20
поставить им другой спецификатор доступа, потестировать, затем обратно выставить private

а как в таком случае будет работать ночное тестирование?

Самый нормальный вариант закрытые методы, которые надо протестировать надо делать пакетными - это даже супер-пупер гуру типа Мартина Фаулера советуют делать.

Автор: Saboteur 19.3.2009, 19:27
А нельзя создать внутренний класс, который будет иметь доступ ко всем частям внешнего?
 smile 

Кстати: 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  smile  smile  smile  smile 

Автор: Saboteur 20.3.2009, 20:46
Samotnik, не поверишь, я даже так делал, smile   smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)