Как повторно инициализировать мой боб - PullRequest
0 голосов
/ 07 декабря 2010

В моем applicationContext-test.xml есть компонент, который я использую для насмешки над внешней поисковой системой.Таким образом, когда я запускаю тесты, всякий раз, когда код моего приложения ссылается на эту поисковую систему, я знаю, что использую свой фиктивный движок вместо реального.

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу этодвигатель вести себя по-разному в разных сценариях.Например, когда я звоню getDocuments(), я обычно хочу, чтобы он возвратил документы.Но иногда я хочу, чтобы оно генерировало исключение, чтобы убедиться, что код моего приложения обрабатывает это исключение надлежащим образом.

Я могу добиться этого, ссылаясь на bean-компонент в моем тестовом коде и изменяя некоторые заглушки, но затем я долженверните заглушки на прежние значения, чтобы другие мои тесты также прошли.По многим причинам это кажется плохой практикой, поэтому я ищу альтернативы.

Одной из альтернатив, которую я рассмотрел, была полная повторная инициализация компонента.Бин инициализируется из applicationContext-test.xml статическим фабричным методом.Я хочу сделать следующее:

  1. Ссылка на bean-компонент из моего тестового кода для изменения некоторых его заглушек
  2. Запустить тест с использованием этих новых заглушек
  3. ВВ конце этого теста переинициализируйте 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() все равно выдает исключение, которое было вставлено ранее.Ясно, что моя реинициализация затронула только локальную переменную, а не сам бин.

Может кто-нибудь сказать мне, как я могу достичь своей цели?

Обновление

Хотя я ценю предложения о том, как писать лучшие тесты и лучшие макеты, моя цель состоит в том, чтобы повторно инициализировать бин.Я считаю, что стоит научиться делать это независимо от того, соответствует ли это моему сценарию использования или нет (я считаю, что оно подходит для моего варианта использования, но мне трудно убедить некоторых из моих критиков здесь).

Единственные ответы, которые получат от меня какие-либо голоса или зеленые галочки, - это те, которые подсказывают, как я могу заново инициализировать свой боб.

Ответы [ 3 ]

1 голос
/ 07 декабря 2010

Вы должны определить случаи, когда вы хотите получить результат, и случаи, когда вы хотите исключение. Они должны быть дифференцированы по входным параметрам метода. В противном случае это не очень хороший тест. Таким образом, для данного набора параметров выходные данные должны быть предсказуемыми.

0 голосов
/ 25 марта 2011

Вместо:

factory = EngineMocks.createMockEngineFactory();

do:

factory.callMethodThatChangesTheStateOfThisObjectSuchThatItIsSuitableForYourTest(withOptionalParameters);

Кроме того, если вы используете Spring Integration Testing, обязательно аннотируйте свой метод @DirtiesContext, чтобы он невлияет на следующий тест.

0 голосов
/ 07 декабря 2010

Как насчет внедрения различных реализаций поисковой системы? Просто создайте больше бинов, представляющих различные макеты поисковой системы.

  • один тестовый класс инициализируется одним макетом, а другой тестовый класс - другим макетом; это, конечно, означает, что у вас будет больше тестовых классов для определенного класса, который вы тестируете (не так хорошо / чисто)

или ...

  • Внедрить больше издевательств (поисковой системы) в 1 классе тестирования. некоторые методы тестирования (из этого класса тестирования) используют один макет, другие методы тестирования используют другой макет
...