Мы используем двойные persistence.xml файлы для рабочих и тестовых сред, но это проблема, связанная только с classpath (мы используем Eclipse, но не сильно используем плагины WTP). Единственное различие между ними заключается в том, что рабочая версия не содержит определений сущностей.
Мы не используем фальшивый фреймворк для тестирования JPA, так как это не добавит никакой ценности нашим тестам. Тесты запускают реальный доступ к данным с помощью JPA, который взаимодействует с базой данных PostgreSQL.
Наш подход к тестированию основан на тестовой среде Spring для персистентного уровня: тестирование в транзакции. Наше приложение основано на Spring, но этот подход одинаково применим для произвольных приложений, которые хотят использовать преимущества тестовых классов Spring. Суть в том, что каждый тест выполняется в рамках одной транзакции, которая никогда не фиксируется, и в конце (в tearDown) он автоматически откатывается. Это решает проблему загрязнения данных и проверки зависимости очень приятным, ненавязчивым и прозрачным способом.
Среда тестирования Spring является гибкой и позволяет проводить многозадачное тестирование, но это особые случаи, которые составляют не более 10% тестов.
Мы по-прежнему используем устаревшую поддержку для JUnit 3.8 , но новая Spring TestContext Framework для JUnit 4 выглядит очень привлекательно.
Для настройки тестовых данных внутри транзакции мы используем собственный служебный класс, который создает бизнес-объекты. Так как он распределяется между всеми тестами, накладные расходы на его поддержку и поддержку значительно превышают преимущества наличия стандартного и надежного способа настройки тестовых данных.
Spring DI помогает сделать тесты краткими и информативными, но это не критично.