В моем applicationContext-test.xml есть компонент, который я использую для насмешки над внешней поисковой системой.Таким образом, когда я запускаю тесты, всякий раз, когда код моего приложения ссылается на эту поисковую систему, я знаю, что использую свой фиктивный движок вместо реального.
Проблема, с которой я сталкиваюсь, заключается в том, что я хочу этодвигатель вести себя по-разному в разных сценариях.Например, когда я звоню getDocuments()
, я обычно хочу, чтобы он возвратил документы.Но иногда я хочу, чтобы оно генерировало исключение, чтобы убедиться, что код моего приложения обрабатывает это исключение надлежащим образом.
Я могу добиться этого, ссылаясь на bean-компонент в моем тестовом коде и изменяя некоторые заглушки, но затем я долженверните заглушки на прежние значения, чтобы другие мои тесты также прошли.По многим причинам это кажется плохой практикой, поэтому я ищу альтернативы.
Одной из альтернатив, которую я рассмотрел, была полная повторная инициализация компонента.Бин инициализируется из applicationContext-test.xml статическим фабричным методом.Я хочу сделать следующее:
- Ссылка на bean-компонент из моего тестового кода для изменения некоторых его заглушек
- Запустить тест с использованием этих новых заглушек
- ВВ конце этого теста переинициализируйте bean-компонент, используя метод статической фабрики, указанный в applicationContext-test.xml
Я пытался что-то вроде этого:
ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(
new String[] { "applicationContext-test.xml" });
Factory factory = appContext.getBean(Factory.class);
factory = EngineMocks.createMockEngineFactory();
Но это не делаеттрюк.Любые тесты, которые запускаются после этого, все равно не пройдут.Кажется, что моя новая переменная factory
содержит Factory
, который я хочу и ведет себя соответствующим образом, но когда на компонент ссылаются в другом месте, getDocuments()
все равно выдает исключение, которое было вставлено ранее.Ясно, что моя реинициализация затронула только локальную переменную, а не сам бин.
Может кто-нибудь сказать мне, как я могу достичь своей цели?
Обновление
Хотя я ценю предложения о том, как писать лучшие тесты и лучшие макеты, моя цель состоит в том, чтобы повторно инициализировать бин.Я считаю, что стоит научиться делать это независимо от того, соответствует ли это моему сценарию использования или нет (я считаю, что оно подходит для моего варианта использования, но мне трудно убедить некоторых из моих критиков здесь).
Единственные ответы, которые получат от меня какие-либо голоса или зеленые галочки, - это те, которые подсказывают, как я могу заново инициализировать свой боб.