2016-03-20 1 views
1

У меня есть веб-приложение весны, которое подключается к некоторым брокерским сообщениям сообщений jms, и теперь я нахожу ошибки теста и сбои после перехода с Spring 3.2.16 на Spring 4.2.4.RELEASE.Обновление 4-го обновления сейчас тесты junit терпят неудачу на «GenericApplicationContext еще не обновлен»?

Ниже приведена ошибка, которую я получаю после простого изменения весенней версии на модульных тестах, которые используют JmsTemplate.

org.springframework[email protected] has not been refreshed yet 

тест классы настроены так:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"classpath:beans.xml"}) 
public class JMSMiscUtilTest { 

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

Эти методы выполняют вызовы GenericApplicationContext (JmsTemplate) genericContext.getBean (location);

, а затем впоследствии попытаться зарегистрировать фасоль так:

final BeanDefinitionBuilder bDBuilder = BeanDefinitionBuilder 
       .rootBeanDefinition("org.springframework.jms.core.JmsTemplate"); 
genericContext.registerBeanDefinition(location, 
       bDBuilder.getBeanDefinition()); 

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

Это должно быть разрешено весной 3, но не 4.

Как реорганизовать этот код, чтобы оставаться с помощью GenericApplicationContext, или принять другой подход?

________ Edit: ____________

Приложение также имеет много бобов, определенных в XML, который я все еще нужно через вне все время выполнения приложения. Вызов context.refresh(), как и ошибка, указывает на то, что исправлена ​​ошибка «не обновилась», но затем, когда приложение впоследствии пытается использовать один из компонентов, определенных в XML, он выдает ошибку, которой она не существует, поскольку она была протерта из контекста из вызова .refresh.

ответ

0

После регистрации бинов динамически вы должны вызвать context.refresh(), прежде чем снова использовать контекст.

Итак, после того, как вы сделали вызовы registerBeanDefinition (..), вызовите также context.refresh().

Насколько мне известно, это изменение не изменилось с 3 по 4 весны. Что действительно может измениться, так это то, как/когда весна обновляет контекст после каждого тестового метода или тестового класса. Вы можете попытаться изменить это, используя @DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)

+0

Да, но верно ли, что context.refresh() ВСЕГДА будет очищать весь контекст приложения? Причина, по которой я не могу просто вызвать .refresh(), заключается в том, что приложение также загружает кучу фасоли, определенные в XML. Поэтому, когда я использовал .refresh, он загружал компоненты, которые были динамически зарегистрированы в контексте, но также удалил каждый компонент, который ранее был загружен XML, что мне нужно. Есть ли способ обойти это? –

+0

Также следует упомянуть, я пробовал аннотацию @DirtiesContext. Не исправляет проблему, потому что тесты не используют общий контекст для регистрации новых bean-компонентов, это метод, вызванный тестами. –

Смежные вопросы