Они обычно используются в качестве подробной формы обратного вызова.
Я полагаю, вы могли бы сказать, что они являются преимуществом по сравнению с отсутствием их, и каждый раз нужно создавать именованный класс, но аналогичные концепции реализованы гораздо лучше на других языках (как закрытие или блоки)
Вот пример качания
myButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
// do stuff here...
}
});
. Хотя это все еще бесполезно многословно, это намного лучше, чем заставлять вас определять названный класс для каждого раздающего прослушивателя, подобного этому (хотя в зависимости от ситуации и повторного использования это может быть лучшим подходом)
Вы можете попробовать mockito . Тест работает следующим образом:
Вы используете mockito для «реализации» EntityManager
. Вместо реального кода вы используете методы mockito, чтобы сказать: «если приложение вызывает getReference ()
, то вернуть этот объект». В фоновом режиме mockito создаст экземпляр прокси, который перехватывает вызовы метода Java и возвращает указанные вами значения. Вызов других методов вернет null
.
Мокирующие вещи вроде createQuery ()
работают точно так же, но сначала вам нужно создать макет Query
и затем используйте тот же подход, что и в getReference ()
(верните макет запроса).
Поскольку вы не используете настоящий EM, вы не Мне нужен настоящий persistence.xml
.
Намного более простым решением было бы, если бы вы могли установить какое-то свойство для изменения имени файла persistence.xml
, но я не Не думаю, что это возможно.
Некоторые другие ссылки, которые могут помочь:
Лучше всего использовать Spring и модульное тестирование Spring. С Spring вам не требуются два файла persistence.xml, поскольку в вашем persistence.xml ничего нет, все указывается в spring (все, что мы указываем в нашем persistence.xml, - это имя единицы сохранения), и, таким образом, вы можете изменить конфигурацию базы данных и т. д. с помощью spring.
И, как заметил topchef, модульное тестирование на основе транзакций Spring - это великолепно.
Мы используем двойные файлы persistence.xml для производственной и тестовой среды выполнения, но это только проблема, связанная с путями к классам (мы используем Eclipse, но не сильно полагаемся на плагины WTP). Единственная разница между ними заключается в том, что производственная версия не содержит определений сущностей.
Мы не используем фреймворк для тестирования JPA, поскольку это не добавит ценности нашим тестам. Тесты действительно запускают доступ к данным с помощью JPA, который взаимодействует с базой данных PostgreSQL.
Наш подход к тестам основан на тестовой среде Spring для уровня сохраняемости: тестирование в транзакции. Наше приложение основано на Spring, но этот подход одинаково применим для произвольных приложений, которые хотят использовать преимущества тестовых классов Spring. Суть в том, что каждый тест выполняется в рамках одной транзакции, которая никогда не фиксируется, и в конце (в tearDown) она автоматически откатывается. Это решает проблему загрязнения данных и тестовой зависимости очень приятным ненавязчивым и прозрачным способом.
Тестовая среда Spring гибкая, позволяя тестировать несколько транзакций, но это особые случаи, которые составляют не более 10% тестов.
] Мы по-прежнему используем унаследованную поддержку JUnit 3.8 , но новая Spring TestContext Framework для JUnit 4 выглядит очень привлекательно.
Для настройки тестовых данных внутри транзакции мы используем внутреннюю утилиту класс, который создает бизнес-объекты. Поскольку он распределяется между всеми тестами, накладные расходы на его обслуживание и поддержку значительно перевешивают преимущества стандартного и надежного способа настройки тестовых данных.