我有几个测试,它们都扩展了定义Spring测试应用程序上下文的相同根测试。我的一个测试使用了不同的配置文件,所以我用@ActiveProfiles("specialTestProfile")
注释了子类,这个配置文件创建了一个特殊的模拟bean,它在上下文中注入。我想在执行此测试之前和之后清除我的上下文,但我没有找到正确的方法来执行此操作。我知道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)
注释我的父类,我仍然会在某个时候得到上面的错误...你知道如何解决这个问题吗? / p>
答案 0 :(得分:1)
如果没有看到PoolingDataSource
的确切配置,我就无法确切知道如何解决您的问题。
但是,您似乎可以通过调用PoolingDataSource
方法创建具有唯一名称的setUniqueName()
来解决此问题(如果您使用Java,则使用@Bean
方法配置)或设置uniqueName
属性(如果您使用的是XML配置)。如何生成唯一名称取决于您使用的配置样式。
如果没有为创建ApplicationContext
bean的每个PoolingDataSource
设置唯一名称,您将继续看到异常,告诉您无法使用“unittestdb”名称创建第二个池因为它已经存在。原因是init()
中的PoolingDataSource
方法委托给ManagementRegistrar.register()
,在{em>唯一名称下注册了MBean
,并且MBeanServer
用于同一JVM进程中的所有测试(即,套件中的所有测试)。
不是为每个应用程序上下文生成唯一的池名称,另一个选项可能是通过将bitronix.tm.disableJmx
属性设置为false
来禁用JMX。有关详细信息,请参阅isDisableJmx()
中的setDisableJmx()
和bitronix.tm.Configuration
方法。