На самом деле мы называем наши тестовые пакеты так же, как их тестовые аналоги. Таким образом, мы в конечном итоге с этой структурой:
src/main/java
com.hello.world
helloWorld.java
src/test/java
com.hello.world
helloWorldTest.java
Я всегда чувствовал, что это не очень умно, так как вы не можете различить «тест» и «тестировать», только если указаны с именем пакета. С другой стороны, я не нашел случая, чтобы это как-то значило. Является ли хорошей практикой иметь одинаковые соглашения об именах для обоих пакетов (для тестовых случаев и исходных классов)? Если нет, то какой подход лучше?
XXXTest()
вcom.hello.world.test.helloWorldTest.java
. Общим советом было бы, чтобы «Test» появлялся только один раз в пути, поэтому либо (a) используйте test в имени пакета (и назовите тестовый файл так же, как и тестируемый файл), либо (b) сделайте имя пакета то же самое и добавьте «test» к имени файла / класса.Ответы:
Это хорошая конвенция.
Иногда вы также хотите написать модульные тесты для закрытых пакетов классов и методов. Вы не сможете вызывать их из класса юнит-теста, помещенного в другой пакет.
Не должно быть никакой путаницы в том, что классы модульных тестов должны находиться в одном и том же пространстве имен, поскольку их не должно быть в пути к классам при компиляции или запуске производственного кода.
Вот пример небольшого модуля с общедоступным интерфейсом, общедоступным классом фабрики и двумя частными классами реализации пакета:
Скрытие реализаций интерфейса Transmogrifier может быть правильным выбором дизайна. Возможно, ответственность за выбор реализации лежит на классе фабрики.
Поскольку реализации являются пакетно-частными, вам нужно поместить классы модульного тестирования в один и тот же пакет, если вы хотите проверить их напрямую. Если у вас есть классы модульных тестов в каком-то другом пакете, у вас есть только прямой доступ к общедоступному интерфейсу и классу фабрики из ваших тестов.
источник
MapTransmogrifier
иListTransmogrifier
и решить , что они могут быть сделаны в один класс, так что вы создаетеListMapTransmogrifier
, измените завод , чтобы использовать этот и удалить эти два класса. Код теперь не компилируется, поэтому вы должны изменить каждый тест в обоихMapTransmogrifierTest
иListTransmogrifierTest
получить его компиляцию. Тест не пройден. Было ли это из-за изменения тестов или созданияListMapTransmogrifier
? Выходит отладчик, чтобы выяснить ... альтернативно, когда тесты используют фабрику, вы делаете этот рефакторинг и все еще компилирует ...