2015-02-27 3 views
0

У меня есть несколько тестов, которые все распространяются на те же корневые тесты, которые определяют контекст приложения теста Spring. Один из моих тестов использует другой профиль, поэтому я аннотировал дочерний класс с @ActiveProfiles("specialTestProfile"), этот профиль создает специальный макет, который вводится в контексте. Я хочу очистить свой контекст до и после выполнения этого теста, но я не нашел правильный способ сделать это. Я знаю, что среда Spring Spring использует некоторое кэширование контекста и что в моем случае у меня должен быть два разных контекста, и не обязательно перезагружать контекст, но он не работает из-за bitronix, которые генерируют эту странную ошибку, если я не очистить контекст:Тесты на битроникс + весна + Различные профили пружин

Caused by: bitronix.tm.resource.ResourceConfigurationException: cannot create JDBC datasource named unittestdb 
    at bitronix.tm.resource.jdbc.PoolingDataSource.init(PoolingDataSource.java:57) 
    at sun.reflect.GeneratedMethodAccessor404.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1608) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1549) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1479) 
    ... 62 more 
Caused by: java.lang.IllegalArgumentException: resource with uniqueName 'unittestdb' has already been registered 
    at bitronix.tm.resource.ResourceRegistrar.register(ResourceRegistrar.java:55) 
    at bitronix.tm.resource.jdbc.PoolingDataSource.buildXAPool(PoolingDataSource.java:68) 
at bitronix.tm.resource.jdbc.PoolingDataSource.init(PoolingDataSource.java:53) 
... 68 more 

Даже если я перезагрузить контекст для каждого тестового класса (по аннотированию моего родительского класса с @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS), я все еще получаю ошибку выше в каком-то момент ... у вас есть какие-либо идеи, как решить эта проблема?

ответ

1

Не видя вашей точной конфигурации для PoolingDataSource, я точно не знаю, как решить вашу проблему.

Однако, похоже, что вы, скорее всего, решите эту проблему, создав свой PoolingDataSource с уникальным именем, вызвав метод setUniqueName() (в методе @Bean, если вы используете конфигурацию Java) или установив свойство uniqueName (если вы используете, re using XML config). Как вы создаете уникальное имя, зависит от стиля конфигурации, который вы используете.

Если вы не задали уникальное имя для каждого ApplicationContext, который создает bean-компонент PoolingDataSource, вы по-прежнему увидите исключение, сообщающее, что второй пул не может быть создан с именем «unittestdb», поскольку он уже существует. Причина заключается в том, что метод init() в PoolingDataSource делегатов ManagementRegistrar.register(), который регистрирует MBean под уникальным именем и тот же MBeanServer используется для всех тестов в рамках того же самого процесса JVM (то есть, для всех тестов в вашем люкс).

Вместо генерации уникального имени пула для каждого контекста приложения другой вариант может быть отключением использования JMX путем установки свойства bitronix.tm.disableJmx на false. Проконсультируйтесь с методами isDisableJmx() и setDisableJmx() в bitronix.tm.Configuration.

+0

thx для вашего ответа Я попробую параметр disableJmx, потому что я alredy попробовал решение uniqueName, но я получил еще одну ошибку, заявив, что я не могу зарегистрировать два разных источника данных XA. Я дам Вам знать! – Abbadon