Менее важной частью является организация тестов.
Я начну с помещения тестов в класс, который относится к тестируемому классу, поэтому у com.jeffreyfredrick.Foo есть тест com.jeffreyfredrick.FooTest. Но если для некоторого подмножества этих классов потребуется другая настройка, я переместу их в свой собственный тестовый класс. Я поместил свои тесты в отдельный каталог с исходными текстами, но сохранил их в одном проекте.
Более важной частью является рефакторинг тестов.
Да, я пытаюсь реорганизовать свои тесты, когда я иду. Цель состоит в том, чтобы удалить дублирование, оставаясь при этом декларативным и легким для чтения. Это верно как в тестовых классах, так и в тестовых классах. В тестовом классе у меня может быть параметризованный метод для создания тестового фейка (макет или заглушка). Мои тестовые подделки обычно являются внутренними классами внутри тестового класса, но если я обнаружу, что это необходимо, я вытащу их для повторного использования в тестах. Я также создам класс TestUtil с общими методами, когда это будет уместно.
Я думаю, что рефакторинг ваших тестов важен для долгосрочного успеха модульного тестирования в больших проектах. Вы когда-нибудь слышали, чтобы люди жаловались на то, что их тесты слишком хрупкие или мешают им измениться? Вы не хотите находиться в положении, когда изменение поведения класса означает внесение десятков или даже сотен изменений в ваши тесты. Как и в случае с кодом, вы достигаете этого путем рефакторинга и поддержания чистоты тестов.
Тесты являются кодом.