我有几个测试,它们都扩展了定义Spring测试应用程序上下文的相同根测试。我的一个测试使用了不同的配置文件,因此我用@ActiveProfiles("specialTestProfile")注释了子类,这个配置文件创建了一个特殊的模拟bean,它被注入到上下文中。我想在执行这个测试之前和之后清除我的上下文,但是我没有找到正确的方法。我知道Spring测试框架做了一些上下文缓存,在我的例子中,我应该有两个不同的上下文,不应该需要重新加载上下文,但是它不能工作,因为如果我不清理上下文,就会产生这个奇怪的错误:
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)注释我的父类,我仍然会在某个时候得到上面的错误)。你知道如何解决这个问题吗?
发布于 2015-02-28 02:43:11
如果没有看到PoolingDataSource的确切配置,我就无法确切地知道如何解决您的问题。
但是,似乎可以通过调用PoolingDataSource方法(如果使用Java在@Bean方法中)或通过设置uniqueName属性(如果使用XML )来创建具有唯一名称的uniqueName,从而解决这个问题。如何生成唯一的名称取决于所使用的配置样式。
如果您没有为创建ApplicationContext bean的每个PoolingDataSource设置一个唯一的名称,那么您将继续看到异常,它告诉您不能使用"unittestdb“名称创建第二个池,因为它已经存在。原因是PoolingDataSource中的PoolingDataSource方法委托给ManagementRegistrar.register(),它以唯一的名称注册了一个MBean,相同的MBeanServer用于同一个JVM进程中的所有测试(即用于您套件中的所有测试)。
另一个选项可能不是为每个应用程序上下文生成唯一的池名,而是通过将bitronix.tm.disableJmx属性设置为false来禁用JMX的使用。有关详细信息,请参阅isDisableJmx()和bitronix.tm.Configuration中的setDisableJmx()方法。
https://stackoverflow.com/questions/28766220
复制相似问题